2011-03-11 14 views
11

Bir CSV dosyasını bir mysql veritabanına yüklemekte sorun yaşıyorum. dize Biçimlendirme sırasında dönüştürülmemiş tüm argümanlar: Ben TypeError söyleyerek bir hata alıyorumTypeError: dize biçimlendirme sırasında dönüştürülen tüm argümanlar değil

for q in csvReader: 
    name, price, LastUpdate, today = q 
    co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(name, price, LastUpdate);""",q) 

: İşte benim kod.

Ad sütunu bir dizedir, fiyat yüzdür ve LastUpdate bir tarihtir. Biraz okudum ve değerleri% (değer) s ve% (değer) d (benim durumumda d yerine f kullanıyorum) içeren bazı komut dosyaları gördüm ama sonra farklı bir hata alıyorum:

TypeError: format Bir eşlemeyi gerektirir

Herhangi biri yanlış yaptığımı bana gösterebilir mi?

Teşekkür ederiz!

+0

Hangi mysql kütüphanesini kullanıyorsunuz? – chmullig

+0

Python'da kullanıyorum MySQLdb – Lostsoul

cevap

14

argümanlar alacak olarak bıraktığınız varsa, argüman tuple öğelerinin biçimlendirilmesini istediğiniz konumları belirtmek için sorguda MySQLdb ile %s kullanmalısınız. Bu, diğer birçok uygulamada kullanılan olağan ? yer tutucudan farklıdır.

for q in csvReader: 
    name, price, LastUpdate, today = q 
    co.execute("INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %s, %s);",q) 

DÜZENLEME: Burada da aynı anda birden fazla satır sokulması bir örneği de, bunları tek tek sokulması daha etkilidir. MySQLdb User's Guide Gönderen: hata mesajı itibaren

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

Here we are inserting three rows of five values. Notice that there is a mix of types (strings, ints, floats) though we still only use %s. And also note that we only included format strings for one row. MySQLdb picks those out and duplicates them for each row.

+0

Teşekkürler Timo. Gönderdiğiniz ilk kodu (deyim için) denedim ve hala bu hatayı aldım: TypeError: dize biçimlendirmesi sırasında dönüştürülen tüm argümanlar Bence bir for döngüsüne ihtiyacım var çünkü bendeki bazı mantığı programlamaya ihtiyacım var. id kodlarına isim, vb ..). Bu yardımcı olur mu bilmiyorum ama burada daha fazla kod: co = db.cursor() dataFile = dosya ("funds.csv", "rb") csvReader = csv.reader (dataFile) – Lostsoul

+0

Geç cevap için üzgünüz, ama Sözdizimi dize (üçlü tırnak) tanımlayıcılarını kaldırmayı deneyebilir ve bunu düzeltip düzeltmediğini deneyebilirsiniz. – Timo

+0

Kullanmalısınız? veritabanı iç değer ekleme için% s yerine –

1

biçimi haritalama gerektirir çünkü dizgi değiştirme belirteçlerine bir ad ayarlıyorsunuz ve bir sözlük bekleniyor.

Doğru hatırlıyorsam% s% d% f vb parantez dışarı ile, bir liste veya tuple (q) sırayla

for q in csvReader: 
    co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %f, %s);""",q[:-1]) 
5

, execute() yöntem % kullanarak bir SQL sorgusuna Parametrelerinizi ikame edilir. Ama hiçbirinin nereye gittiğini göstermediniz, bu yüzden hiçbir parametreniz kullanılmıyor, hepsi geride kalıyor ve bu yüzden biraz sollama hakkında mesaj alıyorsunuz (hey, hepsi biraz!). Bir ikame jetonu olarak kullanmak istediğinizi öğrenmek için veritabanı sürücünüzün belgelerini okuyun; muhtemelen %s.

İlgili konular