【问题标题】:SQLAlchemy: different output on queries "field IS NULL" and "IS NOT NULL" on aliased modelSQLAlchemy:别名模型上查询“field IS NULL”和“IS NOT NULL”的不同输出
【发布时间】: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


    【解决方案1】:

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

    现在有一个错误修复,您可以从树的顶部拉出来构建/修复您的 sqlalchemy 包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多