SQLAlchemy:别名模型上查询 "field IS NULL" 和 "IS NOT NULL" 的不同输出

SQLAlchemy: different output on queries "field IS NULL" and "IS NOT NULL" on aliased model

在从别名模型查询字段时,我注意到一个非常奇怪的行为。似乎 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
"""

您可以看到第二个查询中存在交叉联接,而第一个和第三个查询按预期工作。除了第三个例子,这个问题有什么解释或解决方案吗?

您在 sqlalchemy 中发现了一个错误!我向 sqlalchemy 团队提交了错误报告,并制定了可能的修复方法。您可以查看状态 here

错误修复现已到位,您可以从树的顶部拉到 build/fix 您的 sqlalchemy 包。