2009-06-23 5 views
3

Ich kann meinen Fehler im folgenden Code nicht finden. Wenn es eine Art Fehler ausgeführt wird, wird für die Linie gegeben: cur.executemany (sql% itr.next()) => "Funktion genau 2 Argument (1 angegeben),Problem mit SQLite Executemany

import sqlite3 
con = sqlite3.connect('test.sqlite') 
cur = con.cursor() 
cur.execute("create table IF NOT EXISTS fred (dat)") 

def newSave(className, fields, objData): 
    sets = [] 
    itr = iter(objData) 
    if len(fields) == 1: 
     sets.append(':' + fields[0]) 
    else: 
     for name in fields: 
      sets.append(':' + name) 
    if len(sets)== 1: 
     colNames = sets[0] 
    else: 
     colNames = ', '.join(sets) 
    sql = " '''insert into %s (%s) values(%%s)'''," % (className, colNames) 
    print itr.next() 
    cur.executemany(sql % itr.next()) 
    con.commit() 

if __name__=='__main__': 
    newSave('fred', ['dat'], [{'dat':1}, {'dat':2}, { 'dat':3}, {'dat':4}]) 

Ich schätze deine Gedanken.

+5

Diesen Titel zu sehen macht mich verrückt. Titel sollte die eigentliche Frage summieren. –

Antwort

2

Siehe the sqlite3 documentation. Wie Sie sehen werden, erwartet die Methode Cursor.executemany zwei Parameter. Vielleicht haben Sie es verwechselt mit der Methode Connection.executemany, die nur einen braucht?

0

Meinten Sie:

cur.executemany (SQL, itr) beachten

auch, dass die Print-Anweisung ein Element aus der Iterator verbraucht.

3

Wie es sagt, nimmt Executemany zwei Argumente. Anstatt die String-Werte selbst mit% zu interpolieren, sollten Sie sowohl die sql als auch die Werte übergeben und vom db-Adapter zitieren lassen.

sql = " '''insert into %s (%s) values(%%s)'''," % (className, colNames) 
cur.executemany(sql, itr.next()) 
+8

das stimmt, außer Interpolation in SQL verwendet die? Zeichen, nicht%, so sollte die ursprüngliche sql Zeichenfolge "in% s (% s) Werte (?)"% (Klassenname, colNames) einfügen – ozan

2

Vielen Dank für Ihre Antworten. Nach dem Drücken und Stochern für mehrere Tage und unter Verwendung Ihrer Anleitung funktioniert das Folgende. Ich bin schuld daran, mein Problem zu überdenken. Benötigte keine iter() Konvertierung. Die Variable objData ist eine Liste und bereits ein iterabler! Dies war einer der Gründe, warum der Code nicht funktioniert hat.

import sqlite3 
con = sqlite3.connect('test.sqlite') 
cur = con.cursor() 
cur.execute("create table IF NOT EXISTS fred (dat, tad)") 

def newSave(className, fields, objData): 
    colSets = [] 
    valSets = [] 
    If len(fields) == 1: 
     colSets.append(fields[0]) 
     valSets.append(':' + fields[0]) 
    else: 
     for name in fields: 
      colSets.append(name) 
      valSets.append(':' + name) 
    if len(colSets)== 1: 
     colNames = colSets[0] 
     vals = valSets[0] 
    else: 
     colNames = ', '.join(colSets) 
     vals = ', '.join(valSets) 
    sql = "insert into %s (%s) values(%s)" % (className, colNames, vals) 
    cur.executemany(sql , objDat) 
    con.commit() 

if __name__=='__main__': 
    newSave('fred', ['dat', 'tad'], [{'dat': 100, 'tad' : 42}, {'dat': 200 , 'tad' : 43}, {'dat': 3 , 'tad' : 44}, {'dat': 4 , 'tad' : 45} ])