2011-11-29 221 views
6

我想在我的数据库中插入一个列表,但是我不能。使用Python将列表插入到我的数据库中

这里是什么,我需要一个例子:

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

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

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

+2

在一般情况下,如果你有一个错误信息,你应该包括它的问题。 –

+0

为什么不使用redis?如果使用ast和redis-py模块,你可以写一个列表到redis.eg.r.set(a,[1,23,3])当你需要这个对象时,你可以使用b = ast.literal_eval(r.get(a))来获取列表 –

回答

12

原始问题的答案是:不,您不能插入这样的列表。

然而,随着一些调整,你可以把这些代码工作通过%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年初展示了如何使用的问题来传递参数标记,它解释了为什么它们是必要的(本质上,它确保正确引用您的变量)。

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) 

两个假设你已经建立的连接名称康涅狄格州。

其他一些建议:

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

  • 如果要插入一个逗号separted列表为单场,通常违反数据库设计的校长,你应该使用一个单独的每个记录一个值。

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

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

+0

HI Larry .... 我想插入两个不同的字符串在同一列....所以当我让查询获得内部是什么该colum ....我知道有两个不同的字符串.....这就是为什么我试图插入值作为列表 – mauguerra

+1

你不能这样做。一列只能容纳一个字符串。您可以在该字符串中使用逗号,使其看起来像两个不同的字符串,但显然,如果其中一个字符串*已经*有逗号,则不起作用。但是您应该查看数据库规范化的想法,并重新设计数据库以使用单独的相关表来保存这些值。永远不会将多个值放入数据库列中。 –

1

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

例如:

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

这个例子很混乱。你不能在SQL字符串中使用像'json.dumps'这样的Python函数。您必须先调用'json.dumps',然后使用其他答案中建议的其中一个参数替换方法将生成的JSON字符串作为参数传递。将JSON字符串存储在数据库列中通常也不是一个好主意。 – tsleyson

相关问题