我有一个存储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,))
首先将我的列表转换为字符串似乎很奇怪,有更好的方法吗?
答案 0 :(得分:5)
将您的(key, listdata)
表替换为(key, index, listitem)
。表的唯一键变为(key, index)
而不是key
,并且您将要确保作为一致性条件,表中任何给定键的索引集从0开始是连续的。
您可能也可能不需要区分列表为空的键和根本不存在的键。一种方法是有两个表(列表中的一个,以及它们的一个元素),因此空的但现有的列表自然地表示为列表中的一行,而元素表中没有对应的行。另一种方法是捏造它,并说index=null
行意味着该键的列表为空。
请注意,如果(并且可能仅当)您希望使用SQL对列表的元素进行操作(例如,编写查询以拉取表中每个列表的最后一个元素),这是值得的。如果您不需要这样做,那么将您的列表视为数据库中的不透明数据并非完全不合理。你只是失去了DB“理解”它的能力。
剩下的问题是如何最好地序列化/反序列化列表。 str/eval
完成这项工作,但有点担心。您可以考虑json.dumps
/ json.loads
,对于整数列表,它是相同的字符串格式,但在解析器中有更多的安全限制。或者,如果空间有问题,您可以使用更紧凑的二进制表示法。
答案 1 :(得分:0)
2种方式。
规范化表格,您需要为列表值设置新表格。所以你得到类似“TABLE list(id)”和“TABLE list_values(list_id,value)”的东西。
您可以序列化列表并放入一列。防爆。 Json,XML等(它在SQL中不是一个很好的实践)。