2012-12-23 14 views
24

Listeler listemiz var, örneğin [['a','b'],['c','d']].Bir kerede çok sayıda satır eklemek için python mysqldb nasıl kullanılır

T ve iki alan F1, F2 adlı bir tablom var. Alan listesindeki ilk öğe F1, F2 için ikinci olarak eşler.

Her bir iç liste için satırları, böyle bir for döngüsü kullanmak yerine tek bir komutta veya çağrıda nasıl ekleyebilirim? MySQLdb User's Guide itibaren

for i in [['a','b'],['c','d']]: 
    c.execute("insert into T (F1,F2) values (%s, %s)", (i[0], i[1])) 

cevap

42

:

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

böylece durumda:

c.executemany("insert into T (F1,F2) values (%s, %s)", 
    [('a','b'),('c','d')]) 
+2

Bu, mySQL derlemesini bir dizi dize işlemiyle kullanmaktan daha verimli midir? Böylece dizginiz "T (F1, F2) değerlerine (a, b), (c, d)" eklenir ve yürütmek için iletilir mi? – Jochen

+2

@Jochen Verilerinizin güvenilir bir kaynaktan geldiğinden emin değilseniz gerçekten bunu yapmak istemezsiniz (ve hala "asla müşteriye güvenmemenin" her koşulda saklanmasının iyi bir kural olduğuna inanıyorum). En azından daha iyi, en azından MySQLdb gibi olgun bir kütüphaneyle çalıştığınız zaman, kendiniz denemek yerine libile gerekli alıntı/kodlama/kaçma işleminden vazgeçmek; Her ne kadar yükü hafifletse bile, gönül rahatlığı buna değer. – kungphu

+0

Maalesef, bu utf8mb4 karakter kümesiyle çalışmıyor. "Bilinmeyen kodlama: utf8mb4" garip bir hata atar –

11

Bu @adamhajari gibi tek bir tabloda tüm satırları yerleştirin ve @zenpoy gibi sql enjeksiyon önlemek mümkündür , aynı zamanda. Sadece büyük bir ekleme ifadesi oluşturmanız ve biçimlendirmeyi mysqldb'nin execute yapmasına izin vermeniz yeterlidir.

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) 

süper okunabilir değil, ama executemany biraz daha hızlı olabilir (yerel bir DB 50000 satır toplu eklemeye çalıştık, executemany% 20 yavaştı).

İlgili konular