使用Python将列表插入我的数据库[重复]

Posted

技术标签:

【中文标题】使用Python将列表插入我的数据库[重复]【英文标题】:Insert list into my database using Python [duplicate] 【发布时间】:2012-01-09 02:41:45 【问题描述】:

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

这是我需要的示例:

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

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

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

【问题讨论】:

一般来说,如果你有错误信息,你应该把它包含在问题中。 为什么不使用redis?如果使用ast和redis-py模块,你可以写一个列表到redis.eg.r.set(a,[1,23,3])。当你需要这个对象,你可以使用 b = ast.literal_eval(r.get(a)) 来获取列表 【参考方案1】:

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

但是,通过一些调整,您可以通过使用 %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 开头的示例显示了如何使用问号传递参数,并解释了为什么需要它们(本质上,它确保正确引用变量)。

【讨论】:

【参考方案2】:

你的问题不清楚。

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

将逗号分隔的列表插入一列:

 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 注入技术的攻击。

【讨论】:

嗨拉里....我想在同一列中插入两个不同的字符串....所以当我进行查询以获取该列内的内容时....我知道那里是两个不同的字符串.....这就是我尝试将值作为列表插入的原因 你不能那样做。一列只能容纳一个字符串。您可以在该字符串中使用逗号以使其看起来像两个不同的字符串,但显然如果其中一个字符串 already 有逗号,则这不起作用。但是您应该查看数据库规范化的想法并重新设计您的数据库以使用单独的相关表来保存这些值。永远永远不会将多个值放入数据库列中。【参考方案3】:

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

例如:

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

【讨论】:

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

以上是关于使用Python将列表插入我的数据库[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何编写python程序将csv数据文件导入关系数据库而不插入重复条目

将 Python 列表(JSON 或其他)插入 MySQL 数据库

使用 Python 删除对象列表中的重复项

Python:将两列数据框转换为一个插入列表[重复]

Python:将列表列表插入另一个列表列表[重复]

如何将大量数据插入数据库[重复]