在python中进行单个插入查询

时间:2012-07-02 12:26:53

标签: python

我尝试为template_list数组中的值创建单个插入查询。这些值适用于字段template_name

dir_template_list = ['template1', 'template2', 'template3']
sql = "INSERT INTO tbltemplate (template_name) VALUES(%s)" % (dir_template_list)

是否有使用字符串占位符创建此查询的简单/更简单方法?

INSERT INTO tbltemplate (template_name) VALUES ('template1'),('template2'),('template3')

编辑:这是我的实际表格结构

FIELD   
-------
id             int(6)         
template_name  VARCHAR(128) 

4 个答案:

答案 0 :(得分:4)

首先,永远不要使用字符串格式来创建查询 - 否则您将冒着SQL注入漏洞的风险,必须处理转义等等。

正确的方法是对每一行使用单个查询并将数据作为参数传递:

sql = "INSERT INTO tbltemplate (template_name) VALUES (%s)"
for template in dir_template_list:
    conn.query(sql, (template,))

要提高性能,您可能希望在事务中或使用预准备语句执行此操作。

答案 1 :(得分:2)

正如ThiefMaster所指出的那样,您永远不应该使用来自用户的输入来使用字符串格式构建SQL查询。这是一个SQL注入漏洞,是当今软件系统中的首要安全问题。

您的数据库提供了一种单独提供查询字符串和数据的方法,这是安全的,您应该使用它:

dir_template_list = ['template1', 'template2', 'template3']
sql = "INSERT INTO tbltemplate (template_name) VALUES(?, ?, ?)"
conn.execute(sql, *dir_template_list)

注意:我不知道您的数据库连接是什么,但conn很常见。此外,不同的数据库对占位符使用不同的语法:?%s都是可能的。

答案 2 :(得分:1)

如果它是一行有3列,代码应该是这样的(假设表存在):

import sqlite3
dir_template_list = ['template1', 'template2', 'template3']
con = sqlite3.connect(":memory:")
sql = "INSERT INTO tbltemplate (template_name) VALUES(?, ?, ?)"
con.execute(sql, dir_template_list)

答案 3 :(得分:1)

好的,我的答案是:

from itertools import repeat
valqs = ','.join(repeat('%s', len(dir_template_list)))
sql = "INSERT INTO tbltemplate (template_name) VALUES(%s)" % valqs

然后在你的游标/连接对象上执行(sql,dir_template_list)。