Python SQLite 问题 - 插入方法

1 投票
2 回答
3326 浏览
提问于 2025-04-16 05:52

在下面的代码中,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,它详细解释了如何完成你需要的操作。

补充一下:
这里有几个简单的理由,说明这种方法比你第二种尝试要好:

  1. 使用内置的字符串转义工具可以避免SQL注入攻击,
  2. executemany 可以接受一个元组列表作为参数。

撰写回答