将数组插入sqlite3 python

时间:2012-07-18 13:48:35

标签: python sqlite list

我有一个字符串列表/数组:

l = ['jack','jill','bob']

现在我需要在slite3中为python创建一个表,我可以使用该表将此数组插入名为“Names”的列中。我不希望每行中有多个每个名称的行。我想要一个包含完全如上所示的数组的行,我希望能够以完全相同的格式检索它。如何在数据库中插入数组作为元素?在创建db本身时,我应该将其声明为数组的数据类型?像:

c.execute("CREATE TABLE names(id text, names ??)")

我如何插入值?像:

c.execute("INSERT INTO names VALUES(?,?)",(id,l))
编辑:我是如此愚蠢。我刚刚意识到我可以为id创建多个条目,并使用查询来提取所有相关名称。不管怎样,谢谢!

3 个答案:

答案 0 :(得分:6)

如果以某种方式生成一个字符串表示形式,您可以将数组存储在单个字符串字段中,例如唱pickle模块。然后,当您阅读该行时,您可以取消它。 Pickle将许多不同的复杂对象(但不是全部)转换为字符串,可以恢复该对象。但是:这很可能不是你想要做的事情(除了选择行然后取消选择数组之外,你不能对表格中的数据做任何事情。你将无法搜索。

如果你想拥有不同长度(或固定长度,但许多类似事物的实例),你不希望将它放在一列或多列中。垂直,而不是水平,意思是:不要关于列,考虑行。对于存储具有任意数量组件的向量,表格是一个很好的工具。

从你提供的细节中解释起来有点困难,但你应该考虑创建第二个表并将所有名称放在第一个表的每一行。您需要在第一张桌子上使用一些钥匙,也可以用于第二张桌子:

c.execute("CREATE TABLE first_table(int id, varchar(255) text, additional fields)")
c.execute("CREATE TABLE names_table(int id, int num, varchar(255) name)")

使用此功能,您仍然可以存储除first_table中的名称之外的任何信息,并将名称数组存储在names_table中,只需使用与id中相同的first_table }和num将索引位置存储在数组中。然后,您可以通过执行类似

的操作来取回阵列
SELECT name FROM names_table 
WHERE id=?
ORDER BY num

读取first_table中任何行的名称数组。

这是在数据库中存储数组的一种非常正常的方法。

答案 1 :(得分:1)

这不是要走的路。您应该考虑为具有名称的外键的名称创建另一个表。

答案 2 :(得分:1)

你可以pickle / marshal / json你的数组并将它存储为数据库中的binary / varchar / jsonfield。

类似的东西:

import json

names = ['jack','jill','bill']
snames = json.dumps(names)
c.execute("INSERT INTO nametable " + snames + ";")