postgres pg8000 创建数据库

Posted

技术标签:

【中文标题】postgres pg8000 创建数据库【英文标题】:postgres pg8000 create database 【发布时间】:2019-05-19 17:52:16 【问题描述】:

我正在尝试使用 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数据库workDB']""""

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

【问题讨论】:

请在帖子中添加完整的错误消息 编辑有准确的错误 @tec_abhi 得到这个答案了吗? 【参考方案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

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

【讨论】:

以上是关于postgres pg8000 创建数据库的主要内容,如果未能解决你的问题,请参考以下文章

sql 用于处理创建Postgres数据库的脚本:```PG :: InvalidParameterValue:ERROR:编码UTF8不是

使用 pg_dump 将 Postgres 从 Windows 迁移到 Linux 时如何选择正确的排序规则来创建数据库?

如何使用来自 SqlAchemy+pg8000 的 SSL 连接到 Postgresql?

sql 用于创建抱怨的Postgres数据库的小脚本:```PG :: InvalidParameterValue:ERROR:编码UTF8与区域设置e不匹配

如何使用命令行备份 postgres 数据库

pg快速入门--初步使用