检查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
编写的值冲突。但是执行查询时这并不愉快,对吗?是在创建新对象时?您能否分享产生此错误的最小示例代码?