我正在使用SQLAlchemy在PostgreSQL数据库中的特定模式中生成表。如果架构不存在,我想创建它。我知道PostgreSQL查询来检查架构是否存在:
SELECT exists(select schema_name FROM information_schema.schemata WHERE schema_name = 'foo')
但我想知道如何使用SQLAlchemy处理这个问题。
答案 0 :(得分:4)
@ 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;')
答案 1 :(得分:3)
如果要将其与SQLAlchemy集成,可以使用reflection,但需要更简单快捷的解决方案:
from sqlalchemy.sql import exists, select
exists(select([("schema_name")]).select_from("information_schema.schemata").
where("schema_name == 'foo'"))
这将返回True
或False
。
答案 2 :(得分:1)
我一直在和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
答案 3 :(得分:1)
我正在使用 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
答案 4 :(得分:0)
这对我有用。使用纯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)