1

template_list我试图为数组中的值创建一个插入查询。这些值适用于 field 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

4 回答 4

5

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

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

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

为了提高性能,您可能希望在事务中或使用准备好的语句来执行此操作。

于 2012-07-02T12:29:15.413 回答
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都是可能的。

于 2012-07-02T12:48:53.213 回答
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)
于 2012-07-02T12:51:38.283 回答
0

好吧,我的回答是:

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)。

于 2012-07-02T12:56:36.900 回答