使用Python将列表插入数据库
我想把一个列表放进我的数据库里,但我做不到。
这里有一个我需要的例子:
variable_1 = "HELLO"
variable_2 = "ADIOS"
list = [variable_1,variable_2]
INSERT INTO table VALUES ('%s') % list
像这样可以做到吗?我能把一个列表作为值插入吗?当我尝试的时候,出现了一个错误,提示是MySQL语法有问题。
3 个回答
1
你可以使用 json.dumps
这个功能把一个列表转换成 json 格式,然后把这个 json 写入数据库。
举个例子:
insert table example_table(column_name) values(json.dumps(your_list))
6
你的问题不太清楚。
你是想把一个用逗号分隔的列表放进数据库的一个列里吗?还是想把每个元素放进不同的列里?这两种方法都可以,但做法不一样。
把用逗号分隔的列表放进一个列:
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 注入攻击。
24
你最开始的问题的答案是:不,你不能那样插入一个列表。
不过,如果稍微调整一下,你可以通过使用 %r
并传入一个元组来让代码正常工作:
variable_1 = "HELLO"
variable_2 = "ADIOS"
varlist = [variable_1, variable_2]
print "INSERT INTO table VALUES %r;" % (tuple(varlist),)
可惜的是,这种插入变量的方式会让你的代码容易受到 SQL注入攻击 的威胁。
所以,我们建议使用 Python的数据库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文档 的开头有一个例子,展示了如何使用问号传递参数,并解释了为什么这样做是必要的(主要是为了确保你的变量被正确引用)。