我正在使用 SQLAlchemy 在 PostgreSQL 数据库中的特定模式中生成表。如果架构不存在,我想创建它。我知道用于检查模式是否存在的 PostgreSQL 查询:
SELECT exists(select schema_name FROM information_schema.schemata WHERE schema_name = 'foo')
但我想知道我应该如何使用 SQLAlchemy 处理这个问题。
我正在使用 SQLAlchemy 在 PostgreSQL 数据库中的特定模式中生成表。如果架构不存在,我想创建它。我知道用于检查模式是否存在的 PostgreSQL 查询:
SELECT exists(select schema_name FROM information_schema.schemata WHERE schema_name = 'foo')
但我想知道我应该如何使用 SQLAlchemy 处理这个问题。
@javax 的回答几乎是正确的;以下是一点澄清:
q = exists(select([("schema_name")]).select_from("information_schema.schemata")
.where("schema_name = 'foo'"))
if not session.query(q).scalar():
session.execute('CREATE SCHEMA foo;')
如果你想将它与 SQLAlchemy 集成,你可以使用反射,但为了更简单快捷的解决方案:
from sqlalchemy.sql import exists, select
exists(select([("schema_name")]).select_from("information_schema.schemata").
where("schema_name == 'foo'"))
这将返回True
或False
。
我正在使用 MySQL,这对我有用(使用 sqlalchemy v1.4.1,python 3.9.1):
import sqlalchemy as sa
engine = sa.create_engine("mysql+pymysql://someuser:somepassword@somehost")
inspector = sa.inspect(engine)
myschema = "someschema"
if myschema in inspector.get_schema_names():
print(f"{myschema} schema exists")
如果你想创建一个模式,如果它不存在:
if myschema not in inspector.get_schema_names():
engine.execute(sa.schema.CreateSchema(myschema))
# optional. set the default schema to the new schema:
engine.dialect.default_schema_name = myschema
我一直在将它与 Postgres 一起使用,但惊讶地发现这IF NOT EXISTS
不是 SQL 标准的一部分 -
engine.execute('CREATE SCHEMA IF NOT EXISTS foo;')
显然它是 Postgres 和 MySQL 的扩展 - https://www.w3resource.com/sql/sql-basic/create-schema.php
这对我有用。使用纯 SqlAlchemy 查找模式是否存在:
from sqlalchemy import create_engine
from sqlalchemy import event
from sqlalchemy.schema import CreateSchema, DropSchema
...
engine = create_engine(dbstr)
meta = ModelBase()
...
if not engine.dialect.has_schema(engine, schema=schema_name):
event.listen(meta.metadata, 'before_create', CreateSchema(schema_name))
meta.metadata.reflect(bind=engine, schema=schema_name)
meta.metadata.create_all(engine, checkfirst=True)