使用Python将列表插入我的数据库

2024-05-14 04:05:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在数据库中插入一个列表,但我不能

下面是我需要的一个例子:

variable_1 = "HELLO"
variable_2 = "ADIOS"
list = [variable_1,variable_2]

INSERT INTO table VALUES ('%s') % list

这样的事能做吗?我可以插入一个列表作为值吗? 当我尝试它时,一个错误说那是因为MySQL语法中的一个错误


Tags: 数据库hello列表错误mysqltable语法variable
3条回答

你的问题不清楚。

是否要将列表作为逗号分隔的文本字符串插入数据库中的单个列中?还是要将每个元素插入到单独的列中?两者皆有可能,但技术不同。

在一列中插入逗号分隔的列表:

 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

其他一些建议:

  • 尽量避免插入不列出要插入的列的名称和顺序的语句。这类语句会导致非常脆弱的代码;如果在表中添加、删除或移动列,它就会中断。

  • 如果要将逗号分隔的列表插入单个字段,这通常违反了数据库设计的原则,应该使用一个单独的每个记录一个值。

  • 如果要插入到单独的字段中,并且这些字段的名称类似于Word1Word2,那么这同样表明应该使用单独的表。

  • 不要使用直接字符串替换来创建SQL语句。如果其中一个值是,例如o'clock,它将中断。它还为使用SQL注入技术的人的攻击打开了大门。

可以使用json.dumps将列表转换为json并将json写入db。

例如:

insert table example_table(column_name) values(json.dumps(your_list))

你最初的问题的答案是:不,你不能插入这样的列表。

但是,通过一些调整,您可以使用%r并传入一个元组来使代码工作:

variable_1 = "HELLO"
variable_2 = "ADIOS"
varlist = [variable_1, variable_2]
print "INSERT INTO table VALUES %r;" % (tuple(varlist),)

不幸的是,这种类型的变量插入使代码容易受到SQL injection attacks攻击。

相反,我们建议使用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开头的例子展示了如何使用问号传递参数,并解释了为什么它们是必要的(本质上,它确保了变量的正确引用)。

相关问题 更多 >