Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy:使用复合主键将多个外键指向同一个表_Python_Sqlalchemy - Fatal编程技术网

Python 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

在SQLAlchemy中,假设我们有一个带有复合主键的表
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])