Я использую python3, postgress 10 и Psycopg2 для запроса нескольких записей, например, так
import psycopg2
conn = psycopg2.connect(<my connection string>)
with conn:
with conn.cursor() as cur:
cur.execute('select id,field1 from table1')
for id, field1 from cur.fetchall():
print(id,field1)
#todo: how up update field1 to be f(field1) where f is an arbitrary python function
Мой вопрос: как мне обновить значение строк, которые я читаю, и установить значение field1 для произвольного вычисления на основе Python
редактировать: целью является обновление строк в таблице
Вам нужен другой курсор, например:
with conn:
with conn.cursor() as cur:
cur.execute('select id,field1 from table1')
for id, field1 in cur.fetchall():
print(id,field1)
with conn.cursor() as cur_update:
cur_update.execute('update table1 set field1 = %s where id = %s', (f(field1), id))
Однако обратите внимание, что для этого требуется столько же обновлений, сколько для выбранных строк, что, очевидно, неэффективно. Обновление можно выполнить одним запросом с помощью psycopg2.extras.execute_values ():
from psycopg2.extras import execute_values
with conn:
with conn.cursor() as cur:
cur.execute('select id,field1 from table1')
rows = cur.fetchall()
for id, field1 in rows:
print(id,field1)
# convert rows to new values of field1
values = [(id, f(field1)) for id, field1 in rows]
sql = '''
with upd (id, field1) as (values %s)
update table1 t
set field1 = upd.field1
from upd
where upd.id = t.id
'''
with conn.cursor() as cur:
execute_values(cur, sql, values)