SQLite executemany问题
问题描述:
我在下面的代码中找不到我的错误。当它运行一个类型给出误差线: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}])
我感谢你的想法。
答
参见the sqlite3 documentation。如您所见,Cursor.executemany
方法需要两个参数。也许你错误地认为它只有一个?Connection.executemany
方法?
答
也许你的意思是:
cur.executemany(SQL,ITR)
也请注意打印语句从迭代器消耗的一个项目。
答
就像它说的,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
答
谢谢大家的回答。在推动和戳动几天后,并使用你的指导下面的工作。我犯了过量的问题。不需要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-23 06:40:32