gpt4 book ai didi

python - 使用 SQLAlchemy 删除没有相关记录的行

转载 作者:行者123 更新时间:2023-11-29 12:05:50 24 4
gpt4 key购买 nike

我有 2 个表;我们称它们为 table1table2table2 有一个指向 table1 的外键。我需要删除 table1 中那些在 table2 中有零个子记录的行。执行此操作的 SQL 非常简单:

DELETE FROM table1
WHERE 0 = (SELECT COUNT(*) FROM table2 WHERE table2.table1_id = table1.table1_id);

但是,我一直没能找到将此查询转换为 SQLAlchemy 的方法。尝试直接的方法:

subquery = session.query(sqlfunc.count(Table2).label('t2_count')).select_from(Table2).filter(Table2.table1_id == Table1.table1_id).subquery()
session.query(Table1).filter(0 == subquery.columns.t2_count).delete()

刚刚产生了一个错误:

sqlalchemy.exc.ArgumentError: Only deletion via a single table query is currently supported

如何使用 SQLAlchemy 执行此DELETE

  • python 2.7
  • PostgreSQL 9.2.4
  • SQLAlchemy 0.7.10(由于使用 GeoAlchemy 而无法升级,但我很感兴趣是否有更新的版本可以使这更容易)

最佳答案

我很确定这就是您想要的。你应该尝试一下。它使用 EXISTS。

from sqlalchemy.sql import not_

# This fetches rows in python to determine which ones were removed.
Session.query(Table1).filter(not_(Table1.table2s.any())).delete(
synchronize_session='fetch')

# If you will not be referencing more Table1 objects in this session then you
# can just ignore syncing the session.
Session.query(Table1).filter(not_(Table1.table2s.any())).delete(
synchronize_session=False)

delete() 的参数说明:

http://docs.sqlalchemy.org/en/rel_0_8/orm/query.html#sqlalchemy.orm.query.Query.delete

Exists 示例(上面使用 any() 使用 EXISTS):

http://docs.sqlalchemy.org/en/rel_0_8/orm/tutorial.html#using-exists

这里是应该生成的 SQL:

DELETE FROM table1 WHERE NOT (EXISTS (SELECT 1 
FROM table2
WHERE table1.id = table2.table1_id))

如果您使用的是声明式,我认为有一种方法可以访问 Table2.table 然后您可以使用 sqlalchemy 的 sql 层来完成您想要的操作。尽管您遇到了使 session 不同步的相同问题。

关于python - 使用 SQLAlchemy 删除没有相关记录的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17645837/

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