SQLite executemany 的问题
我在下面的代码中找不到我的错误。当运行时,出现了一个类型错误,错误出现在这一行:cur.executemany(sql % itr.next()) => '这个函数需要两个参数,但我只给了一个。
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 个回答
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} ])
2
请查看sqlite3的文档。你会发现,Cursor.executemany
这个方法需要两个参数。也许你把它搞混了,以为它和Connection.executemany
方法一样,只需要一个参数?
3
就像它所说的,executemany这个函数需要两个参数。你不需要自己用%来拼接字符串,而是应该把SQL语句和对应的值一起传给它,让数据库的适配器来处理这些值。
sql = " '''insert into %s (%s) values(%%s)'''," % (className, colNames)
cur.executemany(sql, itr.next())