繁体   English   中英

SQLAlchemy大规模删除orm创建

[英]Sqlalchemy mass deletion orm creation

如何在sqlalchemy orm中表达以下查询?

DELETE FROM ACCESS_STRING_DETAILS WHERE MENU_ID IN(SELECT MENU_ID FROM REDIRECTOR WHERE SERVICE=122)
DELETE FROM TIME_DETAILS WHERE MENU_ID IN(SELECT MENU_ID FROM REDIRECTOR WHERE SERVICE=122)
DELETE FROM REDIRECTOR_INPUT_PARAMS WHERE COMMAND_ID IN(SELECT KEYWORD FROM REDIRECTOR WHERE SERVICE=122)
DELETE FROM REDIRECTOR_COMMANDS WHERE COMMAND_ID IN(SELECT KEYWORD FROM REDIRECTOR WHERE SERVICE=122)
DELETE FROM RANGE_DETAILS WHERE COMMAND_ID IN(SELECT KEYWORD FROM REDIRECTOR WHERE SERVICE=122)
DELETE FROM CLIENT_RSP_DETAILS WHERE KEYWORD IN(SELECT KEYWORD FROM REDIRECTOR WHERE SERVICE=122)
DELETE FROM REDIRECTOR WHERE SERVICE=122

我基本上需要从REDIRECTOR表中MENU_ID与特定SERVICE MENU_IDKEYWORD相匹配的表中的所有记录

您可以先在SERVICE=122单独捕获过滤器; 我假设您使用camelcase为所有与表名称匹配的表提供了模型。

menu_id和关键字选择也被存储以供重用:

service_filter = Redirector.service == 122
menu_id_select = session.query(Redirector.menu_id).filter(service_filter)
keyword_select = session.query(Redirector.keyword).filter(service_filter)

现在,您可以将这些选择应用于所有删除查询:

(session
    .query(AccessStringDetails)
    .filter(AccessStringDetails.menu_id.in_(menu_id_select))
    .delete(False))
(session
    .query(TimeDetails)
    .filter(TimeDetails.menu_id.in_(menu_id_select))
    .delete(False))
(session
    .query(RedirectorInputParams)
    .filter(RedirectorInputParams.command_id.in_(keyword_select))
    .delete(False))
# etc.

session.query(Redirector).filter(service_filter).delete(False)

这些示例将Column.in_方法与select语句一起使用,将后者转换为子选择,以产生如下查询:

DELETE FROM access_string_details WHERE access_string_details.menu_id IN (SELECT redirector.menu_id AS redirector_menu_id 
FROM redirector 
WHERE redirector.service = :service_1)

:service_1参数设置为122

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM