我正在尝试用postgressql的pg8000驱动程序创建一个数据库,但无法创建。手动创建db然后连接到它对我来说很好,但我需要用我的代码创建db。我收到错误"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‘“
请建议我如何创建这个数据库…
发布于 2020-10-11 17:18:01
这里有一个解决方案:
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 againdocs讨论了执行不能在事务中运行命令的问题。问题是,如果还没有正在进行的事务,pg8000会在执行任何execute()之前自动执行begin transaction。这是很好的,直到你开始执行一个不能在事务中执行的命令。在这种情况下,您必须进入自动提交模式,该模式在语句之前隐式启动一个事务,然后提交它,但如果(如CREATE DATABASE)该语句不能在事务内执行,则自动避免执行此操作。
https://stackoverflow.com/questions/53847829
复制相似问题