3

我在以下代码中找不到我的错误。运行时,会为以下行给出类型错误:cur.executemany(sql % itr.next()) => '函数只需要 2 个参数(给定 1 个)

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

我会很感激你的想法。

4

4 回答 4

3

就像它说的那样,executemany 有两个参数。您应该同时传递 sql 和值并让 db 适配器引用它们,而不是自己用 % 插入字符串值。

sql = " '''insert into %s (%s) values(%%s)'''," % (className, colNames)
cur.executemany(sql, itr.next())
于 2009-06-23T06:44:18.850 回答
2

请参阅sqlite3 文档。如您所见,该Cursor.executemany方法需要两个参数。也许你把它误认为Connection.executemany只需要一个的方法?

于 2009-06-23T06:42:10.993 回答
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} ])
于 2009-06-26T19:03:32.920 回答
0

也许你的意思是:

cur.executemany(sql,itr)

另请注意,打印语句使用迭代器中的一项。

于 2009-06-23T06:43:54.343 回答