2

我正在尝试使用 postgressql 的 pg8000 驱动程序创建一个数据库,但无法创建。手动创建一个数据库然后连接到它对我来说很好,但我需要用我的代码创建数据库。我收到错误“sqlalchemy.exc.ProgrammingError: (pg8000.ProgrammingError)”。我试过下面的代码来创建一个数据库。

from sqlalchemy import create_engine
dburl = "postgresql+pg8000://user:pswd@myip:5432/postgres/"
engine = create_engine(dburl)
conn = engine.connect()
conn.execute("COMMIT")
conn.execute("CREATE DATABASE qux")

我也试过下面 -

from sqlalchemy import create_engine
from sqlalchemy.engine import url
settings ={"drivername" : "postgresql+pg8000", "host" : "myip","port" : 5432,"username" : "user","password" : "pswd","database" : "MyTestDB"}
db=create_engine(url.URL(**settings))
db.execute("commit")

这是我得到的确切错误 """sqlalchemy.exc.ProgrammingError: (pg8000.ProgrammingError) ('ERROR', '25001', 'CREATE DATABASE cannot run inside a transaction block') [SQL: 'create database workDB' ]""""

请建议我如何创建这个数据库...

4

1 回答 1

1

这是一个解决方案:

from sqlalchemy import create_engine
dburl = "postgresql+pg8000://user:pswd@myip:5432/postgres/"
engine = create_engine(dburl)
conn = engine.connect()

con.rollback()  # Make sure we're not in a transaction
con.autocommit = True  # Turn on autocommit

conn.execute("CREATE DATABASE qux")
 
con.autocommit = False  # Turn autocommit back off again

文档讨论了执行无法在事务中运行的命令的问题。问题是 pg8000 会在任何 execute() 之前自动执行开始事务,如果还没有正在进行的事务。在您执行无法在事务中执行的命令之前,这很好。在这种情况下,您必须进入自动提交模式,该模式在语句之前隐式启动事务并在之后提交,但如果(如 CREATE DATABASE)语句无法在事务中执行,则会自动避免这样做。

于 2020-10-11T09:18:00.853 回答