我想在我的数据库中插入一个列表,但我不能。
这是我需要的一个例子:
variable_1 = "HELLO"
variable_2 = "ADIOS"
list = [variable_1,variable_2]
INSERT INTO table VALUES ('%s') % list
可以这样做吗?我可以将列表作为值插入吗? 当我尝试它时,错误说是因为MySQL语法中的错误
答案 0 :(得分:15)
原始问题的答案是:不,你不能插入这样的列表。
然而,通过一些调整,您可以使用%r
并传入元组来使代码工作:
variable_1 = "HELLO"
variable_2 = "ADIOS"
varlist = [variable_1, variable_2]
print "INSERT INTO table VALUES %r;" % (tuple(varlist),)
不幸的是,这种变量插入方式使您的代码容易受到SQL injection attacks的攻击。</ p>
相反,我们建议使用Python's DB API并为要插入的数据构建带有多个问号的自定义查询字符串:
variable_1 = "HELLO"
variable_2 = "ADIOS"
varlist = [variable_1,variable_2]
var_string = ', '.join('?' * len(varlist))
query_string = 'INSERT INTO table VALUES (%s);' % var_string
cursor.execute(query_string, varlist)
SQLite3 docs开头的示例显示了如何使用问号传递参数,并解释了为什么它们是必要的(基本上,它确保正确引用变量)。
答案 1 :(得分:4)
你的问题不明确。
是否要将列表作为逗号分隔的文本字符串插入数据库中的单个列?或者您想将每个元素插入一个单独的列?两种都是可能的,但技术是不同的。
将逗号分隔的列表插入一列:
conn.execute('INSERT INTO table (ColName) VALUES (?);', [','.join(list)])
插入单独的列:
params = ['?' for item in list] sql = 'INSERT INTO table (Col1, Col2. . .) VALUES (%s);' % ','.join(params) conn.execute(sql, list)
假设您已建立连接名称conn。
其他一些建议:
尽量避免INSERT语句没有列出您要插入的列的名称和顺序。这种陈述导致代码非常脆弱;如果您在表格中添加,删除或移动列,则会中断。
如果您将逗号分隔列表插入单个字段,这通常会违反数据库设计的原则,您应该使用单独的表,每个记录一个值
如果您要插入单独的字段并且它们的名称类似于Word1
和Word2
,那么这同样表示您应该使用单独的表格。
永远不要使用直接字符串替换来创建SQL语句。如果其中一个值为o'clock
,它将会中断。它还可以让您使用SQL注入技术进行攻击。
答案 2 :(得分:2)
您可以使用json.dumps
将列表转换为json并将json写入db。
例如:
insert table example_table(column_name) values(json.dumps(your_list))