0

psycopg2: insert multiple rows with one queryによると、 executemany の代わりにpsycopg2のexecuteを使用する方がはるかに効率的です。他の人は確認できますか?

上記の StackOverflow の質問は、次のようなステートメントを作成するためにmogrifyを使用することを提案しています。

INSERT INTO table VALUES (value1, value2), (value3, value4)

通常の実行機能を使用してそのようなステートメントを生成することは可能ですか? 私はその形の何かを考えました

cursor.execute("""INSERT INTO table VALUES (%s, %s), (%s, %s)""", ((value1,value2),(value3,value4)))

動作します。

アップデート:

たとえば、SQL ステートメントを実行に渡してみました。

insert into history (timestamp) values (%s),(%s); 

次のタプルで:

(('2014-04-27 14:07:30.000000',), ('2014-04-27 14:07:35.000000',))

しかし、私が戻ってきたのはエラーだけでした:

取得する結果がありません

4

1 に答える 1

8

execute メソッドを使用するには、挿入するデータをリストに配置します。リストはpsycopg2によって配列に適応されます。次に、配列のネストを解除し、必要に応じて値をキャストします

import psycopg2

insert = """
    insert into history ("timestamp")
    select value
    from unnest(%s) s(value timestamp)
    returning *
;"""

data = [('2014-04-27 14:07:30.000000',), ('2014-04-27 14:07:35.000000',)]
conn = psycopg2.connect("host=localhost4 port=5432 dbname=cpn")
cursor = conn.cursor()
cursor.execute(insert, (data,))
print cursor.fetchall()
conn.commit()
conn.close()

executemany とのパフォーマンスの違いが大きいかどうかはわかりません。しかし、私は上記のほうがきれいだと思います。このreturning句は、名前が示すように、挿入されたタプルを返します。

BTWtimestampは予約語であり、列名として使用しないでください。

于 2014-04-27T14:39:08.133 に答える