Nuevo execute_values
método en Psycopg 2.7:
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
)
La forma pitónica de hacerlo en Psycopg 2.6:
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)
Explicación: Si los datos a insertar se dan como una lista de tuplas como en
data = [(1,'x'), (2,'y')]
entonces ya está en el formato exacto requerido como
la values
sintaxis de la insert
cláusula espera una lista de registros como en
insert into t (a, b) values (1, 'x'),(2, 'y')
Psycopg
adapta un Python tuple
a un Postgresql record
.
El único trabajo necesario es proporcionar una plantilla de lista de registros para que sea completada por psycopg
# We use the data list to be sure of the template length
records_list_template = ','.join(['%s'] * len(data))
y colocarlo en la insert
consulta
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
Imprimir las insert_query
salidas
insert into t (a, b) values %s,%s
Ahora a la Psycopg
sustitución de argumentos habituales
cursor.execute(insert_query, data)
O simplemente probando lo que se enviará al servidor
print (cursor.mogrify(insert_query, data).decode('utf8'))
Salida:
insert into t (a, b) values (1, 'x'),(2, 'y')
execute
estrategia. ¡Vi una aceleración de alrededor de 100x gracias a esto!