psycopg2为什么未创建架构?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了psycopg2为什么未创建架构?相关的知识,希望对你有一定的参考价值。
im试图使用psycopg2在postgres数据库中创建模式。
出于某种原因,未创建架构,稍后代码崩溃,因为它试图引用缺少的架构。该连接设置为自动提交模式,因为我可以使用此特定的连接来创建数据库,所以它肯定可以工作。
出于调试目的,我将每一步都包装在自己的try / except语句中。
下面是代码,因为它就在这里,它不会引发任何异常,只是后续失败会因为缺少模式而崩溃。
def createDB(dbName, connString):
conn = psycopg2.connect(connString)
conn.set_session(autocommit =True) # autocommit must be True sein, else CREATE DATABASE will fail https://www.psycopg.org/docs/usage.html#transactions-control
cursor = conn.cursor()
createDB = sql.SQL('CREATE DATABASE {};').format(
sql.Identifier(dbName)
)
createSchema = sql.SQL('CREATE SCHEMA IF NOT EXISTS schema2;')
searchpath = sql.SQL('ALTER DATABASE {} SET search_path TO public, schema2;').format(
sql.Identifier(dbName)
)
dropDB = sql.SQL('DROP DATABASE IF EXISTS {};').format(
sql.Identifier(dbName)
)
try:
cursor.execute(dropDB)
except Exception as e:
print('drop DB failed')
logging.error(e)
conn.close()
exit()
try:
cursor.execute(createDB)
except Exception as e:
print('create DB failed')
logging.error(e)
conn.close()
exit()
try:
cursor.execute(createSchema)
print('schema created')
except Exception as e:
print('create schema failed')
logging.error(e)
conn.close()
exit()
try:
cursor.execute(searchpath)
except Exception as e:
print('set searchpath failed')
logging.error(e)
conn.close()
exit()
conn.close()
添加显式提交也不会成功。我想念什么?
编辑我在控制台日志中添加了一个小屏幕截图。如您所见,下面的代码将被执行。
编辑2出于好奇,我试图在pgadmin中执行以下SQL语句:
CREATE SCHEMA IF NOT EXISTS schema2
并且工作正常,这表明我的SQL没错,所以回到平方。
编辑3-解决方案
所以我想出了一个解决方案,感谢@jjanes为我指出正确的方向。此函数不连接到特定数据库,而是连接到整个服务器,因为im使用它来创建新数据库,因此连接字符串如下所示:
user=postgres password=12345 host=localhost port=5432
这允许我执行服务器级别的操作,例如创建和删除数据库。但是模式是数据库级别的操作。将完全相同的逻辑移至连接到新创建的数据库的代码部分,就像一个超级按钮。
以上是关于psycopg2为什么未创建架构?的主要内容,如果未能解决你的问题,请参考以下文章
pypy3 导入 psycopg2 错误(未定义符号:PyCoder_Encoder)
psycopg2 ImportError:未定义符号:PQconninfo
带有“%%”参数的 Postgres 查询未通过 psycopg2 返回结果