Python SQLAlchemy:使用复合主键将多个外键指向同一个表
在SQLAlchemy中,假设我们有一个带有复合主键的表Python SQLAlchemy:使用复合主键将多个外键指向同一个表,python,sqlalchemy,Python,Sqlalchemy,在SQLAlchemy中,假设我们有一个带有复合主键的表Foo,和Bar,它有两个外键约束将其链接到Foo(每个Bar有两个Foo对象) 我的问题是relationship函数,它使我重复我在ForeightKeyConstraint中已经给出的信息(在primaryjoin)。有没有其他的方法可以让我不必重复信息?将相关的ForeignKeyConstraint传递给关系的某种方式 class Foo(Base): __tablename__ = "Foo" id_1 = Co
Foo
,和Bar
,它有两个外键约束将其链接到Foo
(每个Bar
有两个Foo
对象)
我的问题是relationship
函数,它使我重复我在ForeightKeyConstraint
中已经给出的信息(在primaryjoin
)。有没有其他的方法可以让我不必重复信息?将相关的ForeignKeyConstraint
传递给关系的某种方式
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)")
谢谢。目前无法确定其完整配置。当有多种方法可参考相关表格时,情况总是如此。在您的示例中,sqlalchemy似乎足够聪明,可以根据列的名称进行猜测,但这不是它所能做的,也不应该 虽然看起来你似乎有重复的信息,但事实上你只是对你的关系结构做了明确的描述
事实上,在配置中可以选择指定
外键
,但目前的用途有所不同,因此您仍然需要配置primaryjoin您还可以使用外键
和外键列表
看
谢谢但也有重复。我意识到它不知道使用哪个ForeignKeyConstraint
。但是,例如,如果我可以以某种方式将相关的ForeignKeyConstraint
引用到关系
,并且它可以为自己找出连接表达式(就像给定表中只有一个ForeignKeyConstraint
时那样)然后,这将消除连接细节的重复。是的,事实上,如前所述,可以为关系提供外键
,但目前它不用于推断主要连接
条件。你的案例就是一个很好的例子,可以这样使用。但正如回答中提到的,目前没有。但是你为什么不在我的SQLAlchemy上创建一个特性请求单呢?我想确保我没有遗漏一些明显的东西,到目前为止,我的SQLAlchemy问题就是这样!链接无效。
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])