2017-03-09 53 views
1

我繼承了Postgres數據庫,目前正在清理它。我創建了一個算法,以找到數據不好的行。該算法被編碼爲名爲checkProblems()的函數。利用這一點,我可以選擇包含壞行的行,如下圖所示...清理壞行Postgres表

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

當然,刪除光標處的特定記錄更好。你可以這樣做:

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)