Insertando múltiples filas usando psycopg2

De acuerdo con psycopg2: inserte varias filas con una consulta , es mucho más eficiente usar la ejecución de psycopg2 en lugar de ejecutar muchos . ¿Pueden otros confirmar?

La pregunta anterior de StackOverflow sugiere usar mogrify para crear declaraciones del tipo:

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

¿Es posible generar tal statement usando la función de ejecución regular? Pensé algo de la forma

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

trabajaría.

ACTUALIZAR:

Por ejemplo, intenté pasar a ejecutar la instrucción sql:

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

con la siguiente tupla:

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

Pero todo lo que volví fue el error:

no hay resultados para buscar

Para utilizar el método de ejecución, coloque los datos a insertar en una lista. Una lista será adaptada por psycopg2 a una matriz. A continuación, anula la matriz y emite los valores según sea necesario.

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

No estoy seguro de si la diferencia de rendimiento de la ejecución será significativa. Pero creo que lo anterior es más ordenado. La cláusula de returning , como su nombre indica, devolverá las tuplas insertadas.

La timestamp BTW es una palabra reservada y no debe utilizarse como nombre de columna.