5

我有一个存储python列表的SQL数据库。目前我将列表转换为字符串,然后将其插入数据库(使用sqlite3),即

foo = [1,2,3]
foo = str(foo)

#Establish connection with database code here and get cursor 'cur'

cur.execute("INSERT INTO Table VALUES(?, ?)", (uniqueKey, foo,))

首先将我的列表转换为字符串似乎很奇怪,有没有更好的方法来做到这一点?

4

2 回答 2

5

将您的(key, listdata)表替换为(key, index, listitem). 表的唯一键变为(key, index)而不是 just key,并且您需要确保表中任何给定键的索引集从 0 开始是连续的作为一致性条件。

您可能还需要也可能不需要区分列表为空的键和根本不存在的键。一种方法是有两个表(一个列表和一个它们的元素),以便一个空但现有的列表自然地表示为列表表中的一行,而元素表中没有相应的行。另一种方法是捏造它并说一行index=null暗示该键的列表是空的。

请注意,如果(并且可能仅当)您想使用 SQL 对列表的元素进行操作(例如编写查询以提取表中每个列表的最后一个元素)时,这是值得的。如果您不需要这样做,那么将您的列表视为数据库中的不透明数据并非完全不合理。您只是失去了数据库“理解”它的能力。

剩下的问题是如何最好地序列化/反序列化列表。str/eval做这项工作,但有点令人担忧。您可能会考虑json.dumps/ json.loads,它对于整数列表是相同的字符串格式,但在解析器中有更多的安全限制。或者,如果空间是一个问题,您可以使用更紧凑的二进制表示。

于 2013-09-02T22:49:43.420 回答
0

2种方式。

  1. 规范化表格,您需要为列表值设置新表格。所以你会得到类似“TABLE list(id)”和“TABLE list_values(list_id, value)”的东西。

  2. 您可以将列表序列化并放入一列。前任。Json、XML 等(在 SQL 中这不是一个很好的做法)。

于 2013-09-02T22:33:39.173 回答