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)
これを行うより良い方法はありますか?