首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sqlalchemy删除需要45分钟,如何提高速度

使用sqlalchemy删除需要45分钟,如何提高速度
EN

Stack Overflow用户
提问于 2022-09-27 08:55:05
回答 1查看 55关注 0票数 0

我正在尝试转换下面给出的SQL语句:

代码语言:javascript
复制
DELETE FROM  traceability.autodiscovery WHERE (sapsystemname) in (SELECT DISTINCT sapsystemname FROM traceability.lastrun_workorders)

对此使用sqlalchemy:

代码语言:javascript
复制
autodiscovery.delete().where(autodiscovery.c.sapsystemname in df['sapsystemname'].unique().tolist())

问题是,如果我执行以下操作:

代码语言:javascript
复制
print(autodiscovery.delete().where(autodiscovery.c.sapsystemname in df['sapsystemname'].unique().tolist()))

我得到了这个输出:

代码语言:javascript
复制
DELETE FROM autodiscovery WHERE false

知道了需要做什么,我不得不迭代列表来得到我所需要的东西。

代码语言:javascript
复制
for i in df['sapsystemname'].unique().tolist():
    print(autodiscovery.delete().where(autodiscovery.c.sapsystemname == i))

这给出了输出

代码语言:javascript
复制
DELETE FROM  traceability.autodiscovery WHERE sapsystemname is :sapsystemname_1

在这里,:sapsystemname_1只是i

这就引出了另一个问题,

这种删除方式涉及一个循环,当df的大小非常大时,循环会很慢。通常,我必须处理200 k-600 k行的数据集。db表本身有150万条记录,其中我必须删除200 k-600 k行。

对于第一个代码片段,执行删除大约需要45到50分钟。

在这种情况下,什么样的方法可能是有效的?请提出更快的替代方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-30 19:04:29

where方法的参数构造错误。

代码语言:javascript
复制
autodiscovery.c.sapsystemname in df['sapsystemname'].unique().tolist()

是一个标准成员资格测试,测试列对象autodiscovery.c.sapsystemname是否存在于df['sapsystemname'].unique().tolist()生成的列表中。它不是,因此该参数的计算结果立即为False

要创建IN子句,需要将值列表传递给列的_方法:

代码语言:javascript
复制
autodiscovery.delete().where(autodiscovery.c.sapsystemname.in_(df['sapsystemname'].unique().tolist()))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73864839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档