6

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

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

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

4

5 回答 5

6

@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;')
于 2013-09-10T11:43:28.420 回答
4

如果你想将它与 SQLAlchemy 集成,你可以使用反射,但为了更简单快捷的解决方案:

from sqlalchemy.sql import exists, select
exists(select([("schema_name")]).select_from("information_schema.schemata").
       where("schema_name == 'foo'"))

这将返回TrueFalse

于 2013-08-21T00:30:43.123 回答
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
于 2021-03-30T10:41:43.257 回答
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

于 2018-05-25T10:42:54.867 回答
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)
于 2020-12-01T23:19:01.480 回答