gpt4 book ai didi

python - Sqlalchemy in_ 子查询

转载 作者:行者123 更新时间:2023-12-04 09:58:34 27 4
gpt4 key购买 nike

我正在尝试使用嵌套的 select 子句实现一个选择,以找到没有任何 child 的 parent 。我的表格(彻底简化)如下:

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 可以为 null 并且不引用任何内容。

我该怎么做?我尝试了 in_ 和 any 运算符的组合,但抛出了不同的异常。例如这个尝试:
empty_persons = config.Session.query(Person).filter(Person.id.notin_(ChildTable.\
person_id)).all()

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

这可能是一件简单的事情,但我只是不明白应该如何做到这一点。

电阻

最佳答案

使用子查询:

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

我认为两者都达到了您想要的结果集。

关于python - Sqlalchemy in_ 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37792261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com