Python 让SQLAlchemy在CREATE_all上发出CREATE SCHEMA
我有一个SqlAlchemy模型,其中有一个模式参数,如下所示:Python 让SQLAlchemy在CREATE_all上发出CREATE SCHEMA,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我有一个SqlAlchemy模型,其中有一个模式参数,如下所示: Base = declarative_base() class Road(Base): __tablename__ = "roads" __table_args__ = {'schema': 'my_schema'} id = Column(Integer, primary_key=True) from sqlalchemy.schema import CreateSchema engine.execute(Cre
Base = declarative_base()
class Road(Base):
__tablename__ = "roads"
__table_args__ = {'schema': 'my_schema'}
id = Column(Integer, primary_key=True)
from sqlalchemy.schema import CreateSchema
engine.execute(CreateSchema('my_schema'))
当我使用Base.metadata.create_all(引擎)时,它会正确地发出一个前面有模式名的create表,比如“create TABLE my_schema.roads”(“但是Postgresql正确地抱怨模式不存在
我是否错过了让SqlAlchemy发出创建模式my_SCHEMA的步骤,或者我必须手动调用它?我已经在我的db init脚本上手动完成了,如下所示:
Base = declarative_base()
class Road(Base):
__tablename__ = "roads"
__table_args__ = {'schema': 'my_schema'}
id = Column(Integer, primary_key=True)
from sqlalchemy.schema import CreateSchema
engine.execute(CreateSchema('my_schema'))
但这似乎没有我想象的那么神奇。我遇到了同样的问题,并且相信发布DDL的“最干净”方式是这样的:
from sqlalchemy import event
from sqlalchemy.schema import CreateSchema
event.listen(Base.metadata, 'before_create', CreateSchema('my_schema'))
这将确保在创建基元数据中包含的任何内容之前,您拥有它的架构。但是,这不会检查架构是否已经存在
你可以做CreateSchema('my_schema')。如果你想写check_schema
回调('onshould_create
in docs),就可以执行\u if(callback=check_schema)
。或者,作为一种简单的解决方法,只需使用DDL(“CreateSchema if NOT EXISTS my_schema”)
(对于Postgres):
我编写了一个函数,它根据接受的答案创建声明的模式。它使用来自每个映射类的\uuu表\uu参数\uuudict的模式值
来自sqlalchemy导入事件,DDL
#在此处导入或写入映射的类和配置
def init_db():
对于Base.registry.mappers中的映射器:
cls=mapper.class_
如果发布类别(cls,基本):
table_args=getattr(cls,'.'table_args'.'无)
如果表_参数为:
schema=table_args.get('schema')
如果架构:
stmt=f“如果不存在{SCHEMA}则创建架构”
listen(Base.metadata,'before_create',DDL(stmt))
Base.metadata.create_all(bind=engine)
我可以只为Postgres中新创建的架构运行迁移吗?@Emu您可能想作为一个单独的问题提问。但您可能必须检查该架构是否不存在——如果不存在,请创建该架构并运行您想要的任何迁移。我的回答没有严格说明这一点。您可能需要查看完整的迁移库,例如SQLAlchemy迁移或alembic。