Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 让SQLAlchemy在CREATE_all上发出CREATE SCHEMA_Python_Postgresql_Sqlalchemy - Fatal编程技术网

Python 让SQLAlchemy在CREATE_all上发出CREATE SCHEMA

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

我有一个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(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
回调('on
should_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。