3

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

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

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

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

我如何也插入值?喜欢:

c.execute("INSERT INTO names VALUES(?,?)",(id,l))

编辑:我太愚蠢了。我刚刚意识到我可以有多个 id 条目并使用查询来提取所有相关名称。不管怎么说,还是要谢谢你!

4

3 回答 3

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,只需使用与 in 相同id的方法first_table并将num索引位置存储在数组中。然后,您可以稍后通过执行类似操作来取回数组

SELECT name FROM names_table 
WHERE id=?
ORDER BY num

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

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

于 2012-07-18T14:05:46.257 回答
2

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

于 2012-07-18T13:52:31.877 回答
1

您可以 pickle/marshal/json 您的数组并将其作为 binary/varchar/jsonfield 存储在您的数据库中。

就像是:

import json

names = ['jack','jill','bill']
snames = json.dumps(names)
c.execute("INSERT INTO nametable " + snames + ";")
于 2012-07-18T13:53:48.030 回答