Novo execute_values
método no 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
)
A maneira pitônica de fazer isso no 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)
Explicação: Se os dados a serem inseridos forem fornecidos como uma lista de tuplas, como em
data = [(1,'x'), (2,'y')]
já está no formato exato necessário, como
a values
sintaxe da insert
cláusula espera uma lista de registros como em
insert into t (a, b) values (1, 'x'),(2, 'y')
Psycopg
adapta um Python tuple
a um Postgresql record
.
O único trabalho necessário é fornecer um modelo de lista de registros a ser preenchido pelo psycopg
# We use the data list to be sure of the template length
records_list_template = ','.join(['%s'] * len(data))
e coloque-o na insert
consulta
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
Imprimir as insert_query
saídas
insert into t (a, b) values %s,%s
Agora, para a Psycopg
substituição de argumentos usuais
cursor.execute(insert_query, data)
Ou apenas testando o que será enviado ao servidor
print (cursor.mogrify(insert_query, data).decode('utf8'))
Resultado:
insert into t (a, b) values (1, 'x'),(2, 'y')
execute
estratégia. Vi uma aceleração de cerca de 100x graças a isso!