我尝试为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)
答案 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)。