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

时间:2011-11-29 18:56:41

标签: python mysql sql

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

这是我需要的一个例子:

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

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

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

3 个答案:

答案 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语句没有列出您要插入的列的名称和顺序。这种陈述导致代码非常脆弱;如果您在表格中添加,删除或移动列,则会中断。

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

  • 如果您要插入单独的字段并且它们的名称类似于Word1Word2,那么这同样表示您应该使用单独的表格。

  • 永远不要使用直接字符串替换来创建SQL语句。如果其中一个值为o'clock,它将会中断。它还可以让您使用SQL注入技术进行攻击。

答案 2 :(得分:2)

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

例如:

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