子查询中的Sqlalchemy

2024-05-14 22:38:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现一个带有嵌套select子句的select,以查找没有任何子级的父级。我的表格(完全简化)如下:

class Person(Base):
    __tablename__ = "person"
    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=True, default=None)

class ChildTable(Base):
    __tablename__ = "foo"
    id = Column(Integer, primary_key=True)
    data = Column(String)
    person_id = Column(Integer, ForeignKey("person.id"), nullable=True)

在sql中,我的查询是

select id from person where id not in (select person_id from foo);

如何在Python和sqlalchemy中实现这一点?我找到了这个sqlalchemy, select using reverse-inclusive (not in) list of child column values,但它依赖于声明的关系。我不使用关系,因为我有很多问题,主要是其他线程过期或更改其他线程缓存的数据,以及foo.person_id可以为空且不引用任何内容。

我该怎么做?我尝试了in}和任何运算符的组合,但抛出了不同的异常。例如,此尝试:

empty_persons = config.Session.query(Person).filter(Person.id.notin_(ChildTable.\
    person_id)).all()

这将失败:in()接受表达式列表或可选表达式。

这可能是一件简单的事情,但我不明白该怎么做。


Tags: keyinidtruebasestringfoocolumn
2条回答

加入为我工作。谢谢您。 在我的例子中,我试图找到属于特定客户的所有有序对象(主题)。我有三张桌子顾客,订单,主题

stmt = db.session.query(Topics).outerjoin(Order).\
    filter(Order.cust_id == id)

topics = stmt.all()

使用子查询:

sub_stmt = config.Session.query(ChildTable.person_id)
stmt = config.Session.query(Person).filter(~Person.id.in_(sub_stmt))
empty_persons = stmt.all()

发出以下sql:

SELECT person.id AS person_id, person.name AS person_name
FROM person
WHERE person.id NOT IN (SELECT foo.person_id AS foo_person_id
FROM foo)

使用联接:

stmt = config.Session.query(Person).outerjoin(ChildTable).filter(ChildTable.person_id.is_(None))
empty_persons = stmt.all()

发出以下sql:

SELECT person.id AS person_id, person.name AS person_name
FROM person LEFT OUTER JOIN foo ON person.id = foo.person_id
WHERE foo.person_id IS NULL

我想两者都能达到你想要的结果。

相关问题 更多 >

    热门问题