Python SQLite 问题 - 插入方法
在下面的代码中,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)
谢谢你的帮助。
2 个回答
0
第一次尝试把字符串当作值用,这样是不对的。第二次把元组里的字符串值放进字符串里,这样在两种情况下都会出现(...)
。
不过这两种方式都是错的,因为第二种完全没有处理好值。你应该做的是使用参数化查询。
7
insert_query = '''INSERT INTO testTable ({0}) VALUES ({1})'''.format(
(','.join(listOfVars)), ','.join('?'*len(listOfVars)))
cur.executemany(insert_query, tupleForm)
请不要在数据库查询中使用普通的字符串插值。
我们很幸运有 DB-API,它详细解释了如何完成你需要的操作。
补充一下:
这里有几个简单的理由,说明这种方法比你第二种尝试要好:
- 使用内置的字符串转义工具可以避免SQL注入攻击,
executemany
可以接受一个元组列表作为参数。