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的正确架构?谢谢.
我采用的方法(在我的问题中详述)是使用mixins和在sqlAlchemy中为用例指定模式的正确方法(不同模式中的表和不同模型文件中的表类声明).模式名称在表声明中使用__table_args__类成员指定,该成员使用关键字字典{“schema”:“schema_name”}传递.模式名称在mixin / column声明中以“schema_name.table_name.column_name”形式限定.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。