Обновите много строк в таблице postgres, используя psycopg2 и python

У меня есть таблица T с двумя столбцами: Tag (текст) и Score (реальный). Теги остаются постоянными (и может быть несколько строк с одним и тем же тегом), а баллы часто меняются. Новые значения представлены в таком объекте Python (возможно, с миллионами элементов):

recs = [{'tag': t1, 'score': s1}, {'tag': t2, 'score': s2}]

В настоящее время я использую следующий код Python для обновления оценок в таблице:

db_conn = psycopg2.connect(connect_string)
cursor = db_conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
q = "UPDATE T SET Score = %(score)s WHERE Tag = %(tag)s;"
cursor.executemany(q, recs)

Хотя это работает, это довольно медленно. Итак, я ищу решение, которое улучшит скорость кода выше. Любая рекомендация приветствуется.


person shahins    schedule 20.12.2016    source источник
comment
Сначала вам нужно скомпилировать запрос со многими операторами.   -  person Torxed    schedule 20.12.2016
comment
Как насчет создания индекса для T (тега), а затем переиндексации таблицы T в psql?   -  person stdunbar    schedule 20.12.2016
comment
Возможный дубликат Вставка нескольких строк с использованием psycopg2   -  person Torxed    schedule 20.12.2016
comment
Не могли бы вы предоставить свое решение с некоторым кодом?   -  person shahins    schedule 20.12.2016
comment
@Torxed определенно не дубликат. Ссылка, которую вы предоставляете, говорит о вставке, а он спрашивает об обновлении   -  person Kalimantan    schedule 21.09.2019
comment
@Kalimantan Да, но ... поменяйте местами INSERT на UPDATE, а функции psycopg2 одинаковы для обоих. Это называется пакетным выполнением с подготовленными операторами. Вы даже можете создавать таблицы, обновлять записи, вставлять записи, удалять записи с тем же синтаксисом. Отсюда и возможный дубликат.   -  person Torxed    schedule 21.09.2019