在下面的代码中,row 是一个包含 200 个元素(数字)的元组,listOfVars 是一个包含 200 个字符串的元组,这些字符串是 testTable< 中的变量名。 tupleForm 是一个元组列表,每个元组有 200 个元素。
以下代码无效。它返回语法错误:
for row in tupleForm:
cmd = '''INSERT INTO testTable listOfVars values row'''
cur.execute(cmd)
但是,以下工作正常。有人可以解释为什么吗?我发现 sqlite 非常不直观。
for row in tupleForm:
cmd = '''INSERT INTO testTable %s values %s'''%(listOfVars, row)
cur.execute(cmd)
感谢您的帮助。
请您参考如下方法:
insert_query = '''INSERT INTO testTable ({0}) VALUES ({1})'''.format(
(','.join(listOfVars)), ','.join('?'*len(listOfVars)))
cur.executemany(insert_query, tupleForm)
数据库查询请不要使用普通的字符串插值。
我们有幸拥有the DB-API其中详细说明了如何执行您的要求。
编辑:
此方法优于您的第二次尝试的几个简单原因:
- 通过使用内置的字符串转义工具,我们避免了 SQL 注入(inject)攻击,并且
executemany接受元组列表作为参数。
