2017-11-09 60 views
0

タプルのタプルを使って一度に複数の行を更新しようとしています。 私はthis postからSQL文を構築する方法を考え出しましたが、psycopg2に実装することはより困難なことが分かりました。 は、ここで私が持っているものです。psycopg2:テーブルの複数の行をタプルのタプルの値で更新する

c = db.cursor() 

new_values = (("Richard",29),("Ronald",30)) 

sql = """UPDATE my_table AS t 
     SET name = e.name 
     FROM (VALUES %s) AS e(name, id) 
     WHERE e.id = t.id;""" 

c.execute(sql, (new_values,)) 

結果は誤りである:ProgrammingError: table "e" has 1 columns available but 2 columns specified FROM句があると解釈されているので、これは次のとおりです。

FROM (VALUES (("Richard",29),("Ronald",30))) 

の代わり:

FROM (VALUES ("Richard",29),("Ronald",30)) 

I以下を実行することでこれを回避できますが、安全ではないようです:

import re 
c = db.cursor() 

sql = """UPDATE my_table AS t 
     SET name = e.name 
     FROM (VALUES %s) AS e(name, id) 
     WHERE e.id = t.id;""" 
sql = c.mogrify(sql, (new_values,)) 

# Replace the first occurance of '((' with '('. 
sql = sql.replace('((', '(',1) 

# Replace the last occurance of '))' with ')'. 
sql = re.sub(r'(.*)\)\)', r'\1)', sql) 

sql = c.execute(sql) 

これを行うより良い方法はありますか?

答えて

0

This post私は正しい方向に指摘しました。 extras.execute_valuesThe documentationには、UPDATE節を使用した素晴らしい例も含まれています。

c = db.cursor() 
update_query = """UPDATE my_table AS t 
        SET name = e.name 
        FROM (VALUES %s) AS e(name, id) 
        WHERE e.id = t.id;""" 

psycopg2.extras.execute_values (
    c, update_query, new_values, template=None, page_size=100 
) 
関連する問題