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()

添加显式提交也不会成功。我想念什么?

编辑我在控制台日志中添加了一个小屏幕截图。如您所见,下面的代码将被执行。

Console screenshot

编辑2出于好奇,我试图在pgadmin中执行以下SQL语句:

CREATE SCHEMA IF NOT EXISTS schema2

并且工作正常,这表明我的SQL没错,所以回到平方。

编辑3-解决方案

所以我想出了一个解决方案,感谢@jjanes为我指出正确的方向。此函数不连接到特定数据库,而是连接到整个服务器,因为im使用它来创建新数据库,因此连接字符串如下所示:

user=postgres password=12345 host=localhost port=5432

这允许我执行服务器级别的操作,例如创建和删除数据库。但是模式是数据库级别的操作。将完全相同的逻辑移至连接到新创建的数据库的代码部分,就像一个超级按钮。

答案
None

以上是关于psycopg2为什么未创建架构?的主要内容,如果未能解决你的问题,请参考以下文章

pypy3 导入 psycopg2 错误(未定义符号:PyCoder_Encoder)

创建片段的新实例时菜单未膨胀

psycopg2 ImportError:未定义符号:PQconninfo

带有“%%”参数的 Postgres 查询未通过 psycopg2 返回结果

在开发系统上未安装 PostgreSQL 时将 psycopg2 安装到 virtualenv

Postgres:使用psycopg2或附近未终止的引用字符串