使用unnest更新多个postgresql记录

时间:2017-07-19 16:56:53

标签: python postgresql psycopg2

我有一个包含近100万条记录的数据库表。 我添加了一个名为concentration的新列。 然后我有一个函数来计算每个记录的“浓度”。

现在,我想批量更新记录,所以我一直在查看以下问题/答案:https://stackoverflow.com/a/33258295/596841https://stackoverflow.com/a/23324727/596841https://stackoverflow.com/a/39626473/596841,但我不知道如何要使用unnest ...

执行此操作

这是我的Python 3函数来进行更新:

def BatchUpdateWithConcentration(tablename, concentrations):
    connection = psycopg2.connect(dbname=database_name, host=host, port=port, user=username, password=password);
    cursor = connection.cursor();
    sql = """
    update #tablename# as t
    set
        t.concentration = s.con
        FROM unnest(%s) s(con, id)
        WHERE t.id = s.id;
    """
    cursor.execute(sql.replace('#tablename#',tablename.lower()), (concentrations,))
    connection.commit()
    cursor.close()
    connection.close()

concentrations是一个元组数组:

[(3.718244705238561e-16,108264),(...)]

第一个值是双精度,第二个值是整数,分别代表浓度和rowid。

我得到的错误是:

  

psycopg2.ProgrammingError:返回“记录”的函数需要列定义列表   第5行:从不需要(ARRAY [(3.718244705238561e-16,108264),(...                        ^

1 个答案:

答案 0 :(得分:2)

由于Psycopg将Python元组改编为Postgresql匿名记录,因此需要指定数据类型:

from unnest(%s) s(con numeric, id integer)