python sqlite问题 - 插入方法

时间:2010-10-21 18:40:29

标签: 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)

请不要对数据库查询使用常规字符串插值 我们很幸运有the DB-API,它详细解释了如何做你需要的。

编辑:
这种方法比第二次尝试更好的几个快速原因:

  1. 通过使用内置的字符串转义工具,我们避免了SQL注入攻击,
  2. executemany接受元组列表作为参数。

答案 1 :(得分:0)

第一次尝试将字符串用作值,这是错误的。第二个将元组的字符串值替换为字符串,在两种情况下都会产生(...)

但两种形式都不正确,因为第二种形式根本不会逃避价值。您应该正在做的是使用参数化查询。