2017-03-09 5 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']] 

を使用すると、今、私は悪いです行を削除する必要があります。私はそれをする2つの異なる方法があります。まず、クリーンな行をテンポラリテーブルに書き込んで、テーブルの名前を変更します。私はこのオプションがあまりにもメモリを消費すると思います。私がカーソル上の特定のレコードを削除することができればもっと良いでしょう。これもオプションですか?

それ以外の場合、このような状況でレコードを削除するにはどうすればよいでしょうか?私はこれがデータベース管理者が行う比較的一般的なものでなければならないと推測しています...

答えて

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を格納し、 は(ID1、ID2、ID3、ID4)のid

FROMテーブルDELETEのような何かを行うことができます
関連する問題