SQLAlchemy:“创建架构(如果不存在)”

Jan*_*isl 6 python sql database sqlalchemy python-3.x

我想在SQLAlchemy中执行“如果不存在则创建模式”查询。有没有比这更好的方法:

    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
Run Code Online (Sandbox Code Playgroud)

我正在使用Python 3.5。

sta*_*ust 22

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

if not engine.dialect.has_schema(engine, schema_name):
    engine.execute(sqlalchemy.schema.CreateSchema(schema_name))
Run Code Online (Sandbox Code Playgroud)

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

conn = engine.connect()
if conn.dialect.has_schema(conn, schema_name):
    ...
Run Code Online (Sandbox Code Playgroud)

  • 您在“conn”示例 if 子句中缺少“not”:“if not conn.dialect.has_schema”。 (3认同)

Mat*_*hew 7

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

if schemaname not in conn.dialect.get_schema_names(conn):
   conn.execute(schema.CreateSchema(schemaname))
Run Code Online (Sandbox Code Playgroud)


小智 7

从 SQLAlchemy 2.0 版开始,该类就有了可用的if_not_exists参数CreateSchema

from sqlalchemy import create_engine
from sqlalchemy.schema import CreateSchema

connectable = create_engine("postgresql+psycopg2://postgres@localhost/postgres")

with connectable.connect() as connection:
    connection.execute(CreateSchema("new_schema", if_not_exists=True))
    connection.commit()
Run Code Online (Sandbox Code Playgroud)

此外,还有可用的对象has_schema方法Inspector(使用方法创建inspect),可以用作数据库元数据的方言不可知接口来检查模式的存在。也许您会发现它在某些情况下很有用。

from sqlalchemy import create_engine, inspect
from sqlalchemy.schema import CreateSchema

schema = "new_schema"
connectable = create_engine("postgresql+psycopg2://postgres@localhost/postgres")

with connectable.connect() as connection:
    if not inspect(connection).has_schema(schema):
        connection.execute(CreateSchema(schema))
        connection.commit()
Run Code Online (Sandbox Code Playgroud)