在SQLAlchemy中,假设我们有一个包含复合主键的表Foo
和Bar
,它有两个外键约束将其链接到Foo
(每个Bar
有两个Foo
个对象。
我的问题在于relationship
功能,这使我重复primaryjoin
中已经提供的信息(在ForeightKeyConstraint
中)(违反DRY)。是否有其他一种结构方式,以便我不必重复信息?将相关ForeignKeyConstraint
传递给relationship
?
class Foo(Base):
__tablename__ = "Foo"
id_1 = Column(Integer, primary_key=True)
id_2 = Column(Integer, primary_key=True)
class Bar(Base):
__tablename__ = "Bar"
id = Column(Integer, primary_key=True)
foo_1_id_1 = Column(Integer)
foo_1_id_2 = Column(Integer)
foo_2_id_1 = Column(Integer)
foo_2_id_2 = Column(Integer)
__table_args__ = (
ForeignKeyConstraint(
[foo_1_id_1,foo_1_id_2],
[Foo.id_1,Foo.id_2]
),
ForeignKeyConstraint(
[foo_2_id_1,foo_2_id_2],
[Foo.id_1,Foo.id_2]
)
)
foo_1 = relationship(Foo,primaryjoin="(Bar.foo_1_id_1 == Foo.id_1) & (Bar.foo_1_id_2 == Foo.id_2)")
foo_2 = relationship(Foo,primaryjoin="(Bar.foo_2_id_1 == Foo.id_1) & (Bar.foo_2_id_2 == Foo.id_2)")
感谢。
答案 0 :(得分:2)
relationship()实际上无法确定其完整配置。当有多种方式引用相关表格时,情况总是如此 在你的例子中,看起来sqlalchemy可能足够聪明,可以通过列的名称来猜测,但这不是什么,它不应该。
虽然看起来好像有重复信息,但实际上您只是具体关于您的关系配置。
事实上,可以选择在relationship()配置中指定foreign_keys
,但目前的用途有所不同,因此您仍需要配置primaryjoin
。
答案 1 :(得分:0)
您还可以使用foreign_keys
和外键列表。
foo_1 = relationship(Foo, foreign_keys=[foo_1_id_1, foo_2_id_2])
foo_2 = relationship(Foo, foreign_keys=[foo_2_id_1, foo_2_id_2])