使用Python将列表插入数据库

13 投票
3 回答
101355 浏览
提问于 2025-04-17 07:20

我想把一个列表放进我的数据库里,但我做不到。

这里有一个我需要的例子:

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 语句。这样的语句很脆弱;如果你在表中添加、删除或移动列,它就会出错。

  • 如果你把一个用逗号分隔的列表放进一个字段,这通常不符合数据库设计的原则,应该使用一个单独的 ,每条记录只存一个值。

  • 如果你要插入的字段名像 Word1Word2,这也是一个信号,说明你应该使用一个单独的表。

  • 绝不要直接用字符串替换来创建 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文档 的开头有一个例子,展示了如何使用问号传递参数,并解释了为什么这样做是必要的(主要是为了确保你的变量被正确引用)。

撰写回答