2009-06-23 84 views
3

我在下面的代碼中找不到我的錯誤。當它運行一個類型給出誤差線:cur.executemany(SQL%itr.next())>'函數採用恰好2個參數(1給出)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}]) 

我感謝你的想法。

+5

看到這個稱號讓我瘋狂。標題應該總結實際的問題。 – 2009-06-23 06:40:32

回答

2

參見the sqlite3 documentation。如您所見,Cursor.executemany方法需要兩個參數。也許你錯誤地認爲它只有一個?Connection.executemany方法?

0

也許你的意思是:

cur.executemany(SQL,ITR)

也請注意打印語句從迭代器消耗的一個項目。

3

就像它說的,executemany有兩個參數。你不應該用%插入字符串值,而應該傳遞sql和值,並讓db適配器引用它們。

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

這是正確的,除了插值在sql中使用?字符,而不是%,所以原始的sql字符串應該是「插入%s(%s)的值(?)」%(className,colNames) – ozan 2009-06-23 07:17:22

2

謝謝大家的回答。在推動和戳動幾天後,並使用你的指導下面的工作。我犯了過量的問題。不需要iter()轉換。 objData變量是一個列表,並且已經是可迭代的!這是代碼不起作用的原因之一。

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