У меня есть таблица базы данных с почти 1 миллионом записей. Я добавил новый столбец под названием concentration. Затем у меня есть функция, которая вычисляет «концентрацию» для каждой записи.

Теперь я хочу обновить записи в пакетном режиме, поэтому я рассмотрел следующие вопросы / ответы: https://stackoverflow.com / a / 33258295/596841, https://stackoverflow.com/a/23324727/596841 и < a href = "https://stackoverflow.com/a/39626473/596841"> https://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: FROM unnest (ARRAY [(3.718244705238561e-16, 108264), (... ^

1
pookie 19 Июл 2017 в 19:56

1 ответ

Лучший ответ

Поскольку кортеж Python адаптирован Psycopg к анонимной записи Postgresql, необходимо указать типы данных:

from unnest(%s) s(con numeric, id integer)
3
Clodoaldo Neto 19 Июл 2017 в 22:59
Ааааааааааааааааааааааааааааааааааааааа ценность! Я пробовал добавлять типы данных, но случайно поставил их перед переменной ...
 – 
pookie
20 Июл 2017 в 12:54