【问题标题】:Storing Python Lists in SQL Database在 SQL 数据库中存储 Python 列表
【发布时间】:2013-09-03 06:56:35
【问题描述】:

我有一个存储 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,))

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

【问题讨论】:

  • 2 种方式。 1.规范化表格,您需要为列表值设置新表格。所以你会得到类似“TABLE list(id)”和“TABLE list_values(list_id, value)”的东西。 2.可以序列化列表。前任。 Json、XML 等(在 SQL 中不是很好的做法)。
  • 您可以将列表存储为 blob:stackoverflow.com/questions/537077/…

标签: python sql


【解决方案1】:

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

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

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

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

【讨论】:

  • 要考虑的一件事是,OP 可能并不真正需要将索引列表存储在数据库中,并且您的数据在概念上可能同样有效作为一个可以稍后排序的集合,您可以使用更简单的 1:N 关系。 IE。可能是 OP 提到列表主要是因为它们是 Python 中的“默认”集合,而不是因为他需要它们的所有行为。
  • @millimoose:好点子。如果真正需要的只是无序的 1:N 映射(如 Python set),则不需要 index 列,当然 key 列需要设置为非唯一的。
  • 感谢史蒂夫,这实际上正是我所需要的。我的 Python 列表是一个二维列表,其中的行按日期索引,因此我将其用作 SQL 表中的 index 值,并将相应行的其余部分作为不透明数据存储在 listitem 中。
【解决方案2】:

2 种方式。

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

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

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 2014-07-21
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多