我有一个SqlAlchemy模型,其中有一个模式参数,如下所示:

Base = declarative_base()

class Road(Base):
  __tablename__ = "roads"
  __table_args__ = {'schema': 'my_schema'}
  id = Column(Integer, primary_key=True)

当我使用Base.metadata.create_all(engine)时,它会正确地发出一个CREATE TABLE,前面有模式名,比如so CREATE TABLE my_schema.roads (,但Postgresql正确地抱怨模式不存在.

我是否错过了让SqlAlchemy发布CREATE SCHEMA my_schema的步骤,或者我必须手动调用它?

推荐答案

我也遇到了同样的问题,我认为发布DDL的"最干净"方式是这样的:

from sqlalchemy import event
from sqlalchemy.schema import CreateSchema

event.listen(Base.metadata, 'before_create', CreateSchema('my_schema'))

这将确保在创建库的元数据中包含的任何内容之前,您已经拥有了它的模式.然而,这并不判断模式是否已经存在.

如果你愿意写check_schema回调函数(文档中should_create的"Controlling DDL Sequences"),你可以写CreateSchema('my_schema').execute_if(callback_=check_schema).或者,作为一种简单的解决方法,只需使用DDL("CREATE SCHEMA IF NOT EXISTS my_schema")即可(对于Postgres):

from sqlalchemy import DDL

event.listen(Base.metadata, 'before_create', DDL("CREATE SCHEMA IF NOT EXISTS my_schema"))

Postgresql相关问答推荐

Postgresql REPEATABLE Read可以查看事务开始后提交的数据(并且在其他事务开始和提交之前不做任何事情)

org.postgresql. util.PSQLException:使用docker + docker—compose + kafka + springboot时try 连接失败

通过窗口函数收集反连接结果?

为MCV扩展统计设置统计目标

如何在postgres中测试锁定

仅使用 ssl 连接到 Postgresql 数据库

在Postgres游标中从一行变量中减go 另一行变量

postgres 不同类型的更新

执行准备好的语句不返回数据

对 Postgres 进行身份验证时如何使用自定义密码哈希算法?

使用 select 在带有特殊字符的字符串中查找数据

将一列与另一列的每个元素进行比较,该列是一个数组

查找最小值和最大值

heroku、postgreSQL、django、comments、tastepie:没有运算符匹配给定的名称和参数类型

PostgreSQL - 我应该如何使用 first_value()?

PostgreSQL:please specify covering index name是什么意思

无法安装 psycopg2 Ubuntu

如何正确索引多对多关联表?

没有函数匹配给定的名称和参数类型

我应该在 Django DATABASE ENGINE 中使用哪个 Postgres 值?