Nouvelle execute_values
méthode dans 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 manière pythonique de le faire dans 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)
Explication: Si les données à insérer sont données sous forme de liste de tuples comme dans
data = [(1,'x'), (2,'y')]
alors il est déjà dans le format exact requis comme
la values
syntaxe de la insert
clause attend une liste d'enregistrements comme dans
insert into t (a, b) values (1, 'x'),(2, 'y')
Psycopg
adapte un Python tuple
à un Postgresql record
.
Le seul travail nécessaire est de fournir un modèle de liste d'enregistrements à remplir par psycopg
# We use the data list to be sure of the template length
records_list_template = ','.join(['%s'] * len(data))
et placez-le dans la insert
requête
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
Impression des insert_query
sorties
insert into t (a, b) values %s,%s
Passons maintenant à la Psycopg
substitution d'arguments habituelle
cursor.execute(insert_query, data)
Ou simplement tester ce qui sera envoyé au serveur
print (cursor.mogrify(insert_query, data).decode('utf8'))
Production:
insert into t (a, b) values (1, 'x'),(2, 'y')
execute
stratégie. J'ai vu une accélération d'environ 100x grâce à cela!