Psycopg 2.7の新しいexecute_values
メソッド:
data = [(1,'x'), (2,'y')]
insert_query = 'insert into t (a, b) values %s'
psycopg2.extras.execute_values (
cursor, insert_query, data, template=None, page_size=100
)
Psycopg 2.6でそれを行うpythonicの方法:
data = [(1,'x'), (2,'y')]
records_list_template = ','.join(['%s'] * len(data))
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
cursor.execute(insert_query, data)
説明:挿入するデータが次のようなタプルのリストとして指定されている場合
data = [(1,'x'), (2,'y')]
その後、それはすでに正確に必要な形式になっています
句のvalues
構文は、次のinsert
ようにレコードのリストを想定しています
insert into t (a, b) values (1, 'x'),(2, 'y')
Psycopg
Python tuple
をPostgresqlに適合させrecord
ます。
必要な作業は、psycopgが入力するレコードリストテンプレートを提供することだけです。
# We use the data list to be sure of the template length
records_list_template = ','.join(['%s'] * len(data))
insert
クエリに配置します
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
insert_query
出力の印刷
insert into t (a, b) values %s,%s
さて、通常のPsycopg
引数の置換に
cursor.execute(insert_query, data)
または単にサーバーに送信されるものをテストする
print (cursor.mogrify(insert_query, data).decode('utf8'))
出力:
insert into t (a, b) values (1, 'x'),(2, 'y')
execute
戦略を使用するほうがよいことが示唆されています。これで100倍ぐらいスピードアップしました!