在下面的代码中,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)
感谢您的帮助。
答案 0 :(得分:7)
insert_query = '''INSERT INTO testTable ({0}) VALUES ({1})'''.format(
(','.join(listOfVars)), ','.join('?'*len(listOfVars)))
cur.executemany(insert_query, tupleForm)
请不要对数据库查询使用常规字符串插值 我们很幸运有the DB-API,它详细解释了如何做你需要的。
编辑:
这种方法比第二次尝试更好的几个快速原因:
executemany
接受元组列表作为参数。答案 1 :(得分:0)
第一次尝试将字符串用作值,这是错误的。第二个将元组的字符串值替换为字符串,在两种情况下都会产生(...)
。
但两种形式都不正确,因为第二种形式根本不会逃避价值。您应该正在做的是使用参数化查询。