Python Postgres изменить значения строк при чтении результатов - PullRequest
0 голосов
/ 09 декабря 2018

Я использую 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

edit: цель состоит в том, чтобы обновить строки в таблице

1 Ответ

0 голосов
/ 09 декабря 2018

Вам нужен другой курсор, например:

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)
...