如何使用SQLAlchemy检查PostgreSQL模式是否存在?

时间:2013-08-20 22:38:40

标签: python postgresql sqlalchemy

我正在使用SQLAlchemy在PostgreSQL数据库中的特定模式中生成表。如果架构不存在,我想创建它。我知道PostgreSQL查询来检查架构是否存在:

SELECT exists(select schema_name FROM information_schema.schemata WHERE schema_name = 'foo')

但我想知道如何使用SQLAlchemy处理这个问题。

5 个答案:

答案 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'"))

这将返回TrueFalse

答案 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)