【问题标题】:cleaning a Postgres table of bad rows清理坏行的 Postgres 表
【发布时间】:2017-03-09 07:31:07
【问题描述】:

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

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

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

【问题讨论】:

    标签: python postgresql python-2.7 psycopg2


    【解决方案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 table WHERE id IN (id1,id2,id3,id4)

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 2012-09-29
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 2019-07-25
      • 2016-07-18
      相关资源
      最近更新 更多