加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在SQLAlchemy列/外键mixin中指定PostgreSQL架构?

发布时间:2020-12-13 18:06:16 所属栏目:百科 来源:网络整理
导读:现有的PostgreSQL数据库具有以不同“模式”组织的表,以拆分大型数据库(用于在服务器级别扩展和实现微调安全性).类似地,declarative_base表描述被组织在一个包中的不同文件中 – 每个模式一个文件: package __init__.py tables_in_schema1.py tables_in_sche
现有的PostgreSQL数据库具有以不同“模式”组织的表,以拆分大型数据库(用于在服务器级别扩展和实现微调安全性).类似地,declarative_base表描述被组织在一个包中的不同文件中 – 每个模式一个文件:
package
    __init__.py
    tables_in_schema1.py
    tables_in_schema2.py

元数据和引擎对象作为db.Model从包的顶部进入每个文件.例如,tables_in_schema1.py将具有(忽略必要的ORM导入,然后需要后向引用)表alpha:

from package import db

class TableAlpha(db.Model,object):
    __tablename__ = "alpha"
    __table_args__ = ({"schema": "schema1"})

    id_alpha = Column(INTEGER,Sequence("pk_alpha",1,1),primary_key=True)


class MixinAlphaRelation(object):

    @declared_attr
    def id_alpha(cls):
        return Column(INTEGER,ForeignKey("schema1.alpha.id_alpha"))

现在在tables_in_schema2.py中,定义了两个表.一个是独立的表,称为beta,另一个是alpha和beta之间的一对多关系的链接表,称为表rho:

from package import db
from package.tables_in_schema1 import MixinAlphaRelation

class TableBeta(db.Model,object):
    __tablename__ = "beta"
    __table_args__ = ({"schema": "schema2"})

    id_beta = Column(INTEGER,Sequence("pk_beta",primary_key=True)


class MixinBetaRelation(object):

    @declared_attr
    def id_beta(cls):
        return Column(INTEGER,ForeignKey("schema2.beta.id_beta"))


class TableRho(db.Model,MixinAlphaRelation,MixinBetaRelation):
    __tablename__ = "rho"
    __table_args__ = (
        UniqueConstraint("id_alpha","id_beta",name="uq_rho_alpha-beta"),{"schema": "schema2"})

    id_row = Column(INTEGER,Sequence("pk_rho",primary_key=True)

两个mixin的表rho继承的预期目标是生成一个由三行组成的表(并将mixin重用于其他表,这些表也引用了alpha或beta):

CREATE TABLE schema2.rho (
    id_row INTEGER PRIMARY KEY,id_alpha INTEGER REFERENCES schema1.alpha(id_alpha),id_beta INTEGER REFERENCES schema2.beta(id_beta)
    );

CREATE INDEX uq_rho_alpha-beta ON schema2.rho(id_alpha,id_beta);

但是,当尝试通过调用db.create_all()重新创建所有这些表时,SQLAlchemy将发出错误:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with
column ‘rho.id_alpha’ could not find table ‘schema2.alpha’ with
which to generate a foreign key to target column ‘id_alpha’

似乎不是在导入的mixin中指定的表格中找到表格alpha,而是SQLAlchemy似乎在schema2中寻找它.

怎么解决这个问题?有没有办法传递/强制mixin的正确架构?谢谢.

我终于找到了错误 – 表beta声明中的拼写错误或额外的下划线:而不是正确的__tablename__我有__table_name__.如果未指定__tablename__类成员,SQLAlchemy将使用类名作为表名(默认行为)在服务器上创建表.就我而言,它创建了表TableBeta而不是预期的beta.这导致外键mixin找不到表.

我采用的方法(在我的问题中详述)是使用mixins和在SQLAlchemy中为用例指定模式的正确方法(不同模式中的表和不同模型文件中的表类声明).模式名称在表声明中使用__table_args__类成员指定,该成员使用关键字字典{“schema”:“schema_name”}传递.模式名称在mixin / column声明中以“schema_name.table_name.column_name”形式限定.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读