我继承了Postgres数据库,目前正在清理它。我创建了一个算法来查找数据不好的行。该算法被编码为名为checkProblems()
的函数。使用它,我可以选择包含坏行的行,如下所示......
schema = findTables(dbName)
conn = psycopg2.connect("dbname='%s' user='postgres' host='localhost'"%dbName)
cur = conn.cursor()
results = []
for t in tqdm(sorted(schema.keys())):
n = 0
cur.execute('select * from %s'%t)
for i, cs in enumerate(tqdm(cur)):
if checkProblem(cs):
n += 1
results.append({
'tableName': t,
'totalRows': i+1,
'badRows' : n,
})
cur.close()
conn.close()
print pd.DataFrame(results)[['tableName', 'badRows', 'totalRows']]
现在,我需要删除坏的行。我有两种不同的方法。首先,我可以在临时表中写入干净的行,并重命名该表。我认为这个选项太耗费内存。如果我能够删除光标处的特定记录会好得多。这甚至是一种选择吗?
否则,在这种情况下删除记录的最佳方法是什么?我猜这应该是数据库管理员做的相对常见的事情......
答案 0 :(得分:1)
当然删除光标处的特定记录会更好。你可以这样做:
for i, cs in enumerate(tqdm(cur)):
if checkProblem(cs):
# if cs is a tuple with cs[0] being the record id.
cur.execute('delete from %s where id=%d'%(t, cs[0]))
或者您可以存储不良记录的ID,然后执行类似的操作 DELETE FROM表WHERE id IN(id1,id2,id3,id4)