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

使用Python将列表插入我的数据库,python,mysql,sql,Python,Mysql,Sql,我想在数据库中插入一个列表,但我不能 以下是我需要的一个示例: variable_1 = "HELLO" variable_2 = "ADIOS" list = [variable_1,variable_2] INSERT INTO table VALUES ('%s') % list 这样的事情可以做吗?我可以插入一个列表作为值吗? 当我尝试它时,一个错误说那是因为MySQL语法中的一个错误。原始问题的答案是:不,不能插入这样的列表 但是,通过一些调整,您可以使用%r并传入一个元组,从而使

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

以下是我需要的一个示例:

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

INSERT INTO table VALUES ('%s') % list
这样的事情可以做吗?我可以插入一个列表作为值吗?
当我尝试它时,一个错误说那是因为MySQL语法中的一个错误。原始问题的答案是:不,不能插入这样的列表

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

variable_1 = "HELLO"
variable_2 = "ADIOS"
varlist = [variable_1, variable_2]
print "INSERT INTO table VALUES %r;" % (tuple(varlist),)
不幸的是,这种类型的变量插入使代码容易受到攻击

相反,我们建议为要插入的数据使用并构建带有多个问号的自定义查询字符串:

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)

开头的示例演示了如何使用问号传递参数,并解释了为什么必须使用问号(基本上,它确保正确引用变量)。

您的问题不清楚

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

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

插入到单独的列中:

两者都假设您已建立连接名conn

其他一些建议:

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

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

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

  • 切勿使用直接字符串替换来创建SQL语句。如果其中一个值为,例如
    o'clock
    ,则它将中断。它还使您容易受到使用SQL注入技术的人的攻击


您可以使用
json.dumps
将列表转换为json并将json写入数据库

例如:

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

一般来说,如果您有错误消息,您应该将其包含在问题中。为什么不使用redis?如果使用ast和redis py模块,您可以向redis写入一个列表。例如,r.set(a,[1,23,3])。当您需要此对象时,您可以使用b=ast.literal_eval(r.get(a))来获取列表。。。。我想在同一列中插入两个不同的字符串……因此,当我进行查询以获取该列中的内容时……我知道有两个不同的字符串……这就是为什么我尝试将值作为列表插入的原因。您不能这样做。一列只能容纳一个字符串。您可以在该字符串中使用逗号,使其看起来像两个不同的字符串,但如果其中一个字符串已经有逗号,则显然不起作用。但是您应该考虑数据库规范化的想法,并重新设计数据库,以使用一个单独的相关表来保存这些值。永远不要在一个数据库列中放入多个值。这个示例非常混乱。不能从SQL字符串内部使用类似于
json.dumps
的Python函数。您必须首先调用
json.dumps
,然后使用其他答案中建议的一种参数替换方法将生成的json字符串作为参数传递。在数据库列中存储JSON字符串通常也不是一个好主意。
  params = ['?' for item in list]
  sql    = 'INSERT INTO table (Col1, Col2. . .) VALUES (%s);' % ','.join(params)
  conn.execute(sql, list)
insert table example_table(column_name) values(json.dumps(your_list))