检查SqlAlchemy中关系的连接条件

检查SqlAlchemy中关系的连接条件,sqlalchemy,Sqlalchemy,假设我有一个分组的父/子关系,带有复合外键,如下所示: class Group(Base): __tablename__ = 'group' id_ = Column('id', GUID, primary_key=True) class Parent(Base): __tablename__ = 'parent' id_ = Column('id', GUID, primary_key=True) group_id = Column(GUID, For

假设我有一个分组的父/子关系,带有复合外键,如下所示:

class Group(Base):
    __tablename__ = 'group'
    id_ = Column('id', GUID, primary_key=True)

class Parent(Base):
    __tablename__ = 'parent'
    id_ = Column('id', GUID, primary_key=True)
    group_id = Column(GUID, ForeignKey('group.id'), primary_key=True)

    group = relationship(Group)

class Child(Base):
    __tablename__ = 'child'
    id_ = Column('id', GUID, primary_key=True)
    group_id = Column(GUID, ForeignKey('group.id'), primary_key=True)
    parent_id = Column(GUID)

    __table_args__ = (
        ForeignKeyConstraint(
            ['parent_id', 'group_id'],
            ['parent.id', 'parent.group_id']
        ),
    )

    group = relationship(Group)
    parent = relationship(Parent, foreign_keys=[parent_id], backref='children')
我的实际问题是:如何找出连接条件是什么?我希望类似于
Child.parent.join\u的条件


奖励点:
Child.parent
是否会产生这样的连接条件:
ON(Child.group\u id=parent.group\u id和Child.parent\u id=parent.id)
或者我是否需要显式地使用
primaryjoin
参数?编辑我只是重新阅读,看起来不会。在这种情况下,您不需要使用
primaryjoin
。通过包括
组id
来定义
外键就足够了:

class Child(Base):
    ...
    parent = relationship(
        Parent,
        foreign_keys=[parent_id, group_id],
        backref='children',
    )
在这种情况下,包括连接,如:

q = session.query(Child).join(Parent)
print(q)
将产生:

SELECT  child.id AS child_id,
        child.group_id AS child_group_id,
        child.parent_id AS child_parent_id
FROM    child
JOIN    parent
    ON  parent.group_id = child.group_id
    AND parent.id = child.parent_id

注意:在
条件下,
周围不需要括号。

谢谢!但当我这样做时,它抱怨
组id
的所有权不明确:
SAWarning:relationship'Child.parent'会将列parent.group\u id复制到列Child.group\u id,这与…
冲突。无论如何,我的问题是,是否有可能看到
关系的join子句,这样我就可以检查它了。我明白了。您需要了解导致此错误的操作。我有一个简单的自包含测试脚本,它适用于我所展示的内容。我认为这是因为
Child.group
关系也希望写入
group\u id
列,这可能与
Child.parent
编写的值冲突。但是执行
查询时这并不愉快,对吗?是在创建新对象时?您能否分享产生此错误的最小示例代码?