web-dev-qa-db-fra.com

Comment utiliser python mysqldb pour insérer plusieurs lignes à la fois

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]))
32
Tampa

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')])
62
zenpoy

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

19
Rems