簡體   English   中英

SQLAlchemy:“如果不存在則創建架構”

[英]SQLAlchemy: "create schema if not exists"

我想在 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。

我有同樣的問題,我找到的答案是:

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):
    ...

對於 MS Sql 用戶,沒有has_schema()但這似乎有效:

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

您可以使用出色的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 上使用過它。

我完成這項任務的首選方式:

from sqlalchemy import inspect
<You might need a few more SQLAlchemy imports

def setup_schemas(engine, metadata):
    inspector = inspect(engine)
    all_schemas = inspector.get_schema_names()
    for schema in metadata._schemas:
        if schema not in all_schemas:
            _create_schema(engine, schema)
    
def _create_schema(engine, schema) -> None:
    stmt = text(f"CREATE SCHEMA {schema}")
    with engine.connect() as conn:
        conn.execute(stmt)
        conn.commit()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM