【发布时间】:2015-04-21 01:04:39
【问题描述】:
在查询别名模型中的字段时,我注意到一个非常奇怪的行为。似乎 SQLAlchemy 在针对 NOT NULL 条件过滤关系时打破了别名。这是一个例子:
Base = declarative_base()
class Parent(Base):
__tablename__ = 'parents'
id = Column(Integer, primary_key=True)
children = relation('Child', back_populates='parent')
class Child(Base):
__tablename__ = 'children'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parents.id'))
parent = relation('Parent', back_populates='children', uselist=False)
aChild = aliased(Child)
print Session.query(aChild.id).filter(aChild.parent == None)
""" SELECT children_1.id AS children_1_id
FROM children AS children_1
WHERE children_1.parent_id IS NULL
"""
print Session.query(aChild.id).filter(aChild.parent != None)
""" SELECT children_1.id AS children_1_id
FROM children AS children_1, children
WHERE children.parent_id IS NOT NULL
"""
print Session.query(aChild.id).filter(~(aChild.parent == None))
""" SELECT children_1.id AS children_1_id
FROM children AS children_1
WHERE children_1.parent_id IS NOT NULL
"""
您可以看到第二个查询中有一个交叉连接,而第一个和第三个查询按预期工作。除了第三个例子,这个问题有什么解释或解决方案吗?
【问题讨论】:
标签: python orm sqlalchemy relationship alias