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