Sqlalchemy批量删除orm创建

2024-09-29 00:21:18 发布

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

如何在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

我基本上需要的是从表中删除所有与MENU_IDKEYWORD匹配的记录,这些记录针对REDIRECTOR表中的特定SERVICE


Tags: infromidsqlalchemyservice记录ormdetails
1条回答
网友
1楼 · 发布于 2024-09-29 00:21:18

您可以首先分别捕获SERVICE=122上的过滤器;我假设您有与表名匹配的所有表的模型,使用camelcase。你知道吗

菜单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)

这些示例使用^{} method和select语句,将后者转换为subselect,以生成如下查询:

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。你知道吗

相关问题 更多 >