【问题标题】:SQLAlchemy: "create schema if not exists"SQLAlchemy:“如果不存在则创建模式”
【发布时间】:2018-11-28 09:04:42
【问题描述】:

我想在 SQLAlchemy 中执行“CREATE SCHEMA IF NOT EXISTS”查询。 有没有比这更好的方法:

    engine = sqlalchemy.create_engine(connstr)

    schema_name = config.get_config_value('db', 'schema_name')

    #Create schema; if it already exists, skip this
    try:
        engine.execute(CreateSchema(schema_name))
    except sqlalchemy.exc.ProgrammingError:
        pass

我正在使用 Python 3.5。

【问题讨论】:

  • 嗯,你还没有提到你正在使用哪个数据库。目前我在 sqlalchemy 中看不到任何东西,但可以肯定我们可以运行原始 ddl 查询。例如,在 postgres db 的情况下,我们可以执行类似engine.execute('CREATE SCHEMA IF NOT EXISTS schema_name')
  • 我目前正在使用 PostgreSQL,但这意味着将来会被多个数据库使用。这就是为什么我没有使用 psycopg2 或任何其他特定于数据库的工具 - 因为我认为我可以更改每个数据库的 connstr 变量,SQLAlchemy 将在该特定数据库中创建模式。
  • 我错了吗? SQLAlchemy 不是这样工作的吗?
  • 嗯,它会以同样的方式工作,唯一的事情是如果它已经存在,它会抛出编程异常。如果你能优雅地处理它,那么 Sqlalchemy 将能够动态创建模式。

标签: python sql database python-3.x sqlalchemy


【解决方案1】:

我有同样的问题,我找到的答案是:

if not engine.dialect.has_schema(engine, schema_name):
    engine.execute(sqlalchemy.schema.CreateSchema(schema_name))

我们也可以在没有引擎实例的情况下检查架构,但使用连接

conn = engine.connect()
if conn.dialect.has_schema(conn, schema_name):
    ...

【讨论】:

  • 您在 conn 示例 if 子句中缺少 notif not conn.dialect.has_schema
  • 您也可以像这样导入方法:from sqlalchemy.schema import CreateSchema。并直接与engine.execute(CreateSchema(schema_name))一起使用。
【解决方案2】:

对于 MS Sql 用户,没有 has_schema() 但这似乎有效:

if schemaname not in conn.dialect.get_schema_names(conn):
   conn.execute(schema.CreateSchema(schemaname))

【讨论】:

    【解决方案3】:

    您可以使用出色的 sqlalchemy_utils 包以非常简洁的方式做到这一点。

    首先,安装包:

    pip install sqlalchemy_utils
    

    然后像这样使用它:

    from sqlalchemy_utils.functions import database_exists, create_database
    
    engin_uri = 'postgres://postgres@localhost/name'
    
    if not database_exists(engin_uri):
        create_database(engin_uri)
    

    官方文档中的示例使用了 PostgreSQL,我个人在 MySQL 8 上使用过。

    【讨论】:

    • 您的示例展示了如何创建数据库而不是模式。 OP 想知道比他更好的方法来创建特定模式
    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 2017-06-04
    • 2013-04-23
    • 2012-02-04
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    相关资源
    最近更新 更多