2009-06-23 88 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} ])