清理Postgres坏行表

时间:2017-03-09 07:31:08

标签: python postgresql python-2.7 psycopg2

我继承了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']]

现在,我需要删除坏的行。我有两种不同的方法。首先,我可以在临时表中写入干净的行,并重命名该表。我认为这个选项太耗费内存。如果我能够删除光标处的特定记录会好得多。这甚至是一种选择吗?

否则,在这种情况下删除记录的最佳方法是什么?我猜这应该是数据库管理员做的相对常见的事情......

1 个答案:

答案 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)