J'ai une liste de listes, par exemple [['a','b'],['c','d']]
.
J'ai une table appelée T
et deux champs F1
, F2
. Le premier élément de la liste des champs correspond à F1
, deuxième à F2
.
Comment puis-je insérer des lignes pour chaque liste interne dans une seule commande ou appel, plutôt que d'utiliser une boucle for comme celle-ci?
for i in [['a','b'],['c','d']]:
c.execute("insert into T (F1,F2) values (%s, %s)", (i[0], i[1]))
De Guide de l'utilisateur MySQLdb :
c.executemany(
"""INSERT INTO breakfast (name, spam, eggs, sausage, price)
VALUES (%s, %s, %s, %s, %s)""",
[
("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
] )
donc dans votre cas:
c.executemany("insert into T (F1,F2) values (%s, %s)",
[('a','b'),('c','d')])
Il est possible d'insérer toutes les lignes dans une seule instruction comme @adamhajari, et d'éviter en même temps les injections sql comme @zenpoy. Il vous suffit de créer une grande instruction d'insertion et de laisser le execute
de mysqldb faire le formatage.
values_to_insert = [('a','b'),('c','d')]
query = "INSERT INTO T (F1, F2) VALUES " + ",".join("(%s, %s)" for _ in values_to_insert)
flattened_values = [item for sublist in values_to_insert for item in sublist]
c.execute(query, flattened_values)
Pas super lisible, mais peut être légèrement plus rapide que beaucoup d'exécutem (j'ai essayé d'insérer des lots de 50000 lignes dans une base de données locale, exécutemany était 20% plus lent).