我正在尝试转换下面给出的SQL语句:
DELETE FROM traceability.autodiscovery WHERE (sapsystemname) in (SELECT DISTINCT sapsystemname FROM traceability.lastrun_workorders)对此使用sqlalchemy:
autodiscovery.delete().where(autodiscovery.c.sapsystemname in df['sapsystemname'].unique().tolist())问题是,如果我执行以下操作:
print(autodiscovery.delete().where(autodiscovery.c.sapsystemname in df['sapsystemname'].unique().tolist()))我得到了这个输出:
DELETE FROM autodiscovery WHERE false知道了需要做什么,我不得不迭代列表来得到我所需要的东西。
for i in df['sapsystemname'].unique().tolist():
print(autodiscovery.delete().where(autodiscovery.c.sapsystemname == i))这给出了输出
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分钟。
在这种情况下,什么样的方法可能是有效的?请提出更快的替代方案。
发布于 2022-09-30 19:04:29
where方法的参数构造错误。
autodiscovery.c.sapsystemname in df['sapsystemname'].unique().tolist()是一个标准成员资格测试,测试列对象autodiscovery.c.sapsystemname是否存在于df['sapsystemname'].unique().tolist()生成的列表中。它不是,因此该参数的计算结果立即为False。
要创建IN子句,需要将值列表传递给列的_方法:
autodiscovery.delete().where(autodiscovery.c.sapsystemname.in_(df['sapsystemname'].unique().tolist()))https://stackoverflow.com/questions/73864839
复制相似问题