Python 在DB vs列表中存储字符串

Python 在DB vs列表中存储字符串,python,database-design,relational-database,Python,Database Design,Relational Database,我有一个不同长度的字符列表,如['a'、'B'、'B'、'a'、'a'、'B'] 我需要将其存储在数据库中。现在我正在把它转换成一个可以正常工作的字符串,但我想知道还有什么更像python。 在本例中,顺序很重要,但我想知道一般的首选选项(例如,如果列表成员本身就是字符串) 谢谢 编辑: 我的密码有点问题 列表=['A'、'B'、'B'、'A'] 洗牌(列表) str=''.join(列表) 字符串本身存储在数据库中。我不想为我的特定代码/问题寻找解决方案,也没有性能问题——我想知道,就py

我有一个不同长度的字符列表,如['a'、'B'、'B'、'a'、'a'、'B'] 我需要将其存储在数据库中。现在我正在把它转换成一个可以正常工作的字符串,但我想知道还有什么更像python。 在本例中,顺序很重要,但我想知道一般的首选选项(例如,如果列表成员本身就是字符串)

谢谢

编辑: 我的密码有点问题

列表=['A'、'B'、'B'、'A']

洗牌(列表)

str=''.join(列表)


字符串本身存储在数据库中。我不想为我的特定代码/问题寻找解决方案,也没有性能问题——我想知道,就python而言,在数据库中存储blob是否有任何经验法则,因为一些东西(如字典和对象)似乎可以合理地序列化和存储。perharps这更像是一个DB问题,而不是python问题。

老实说,我不完全确定你的问题是什么。你指的是什么?相对于按原样处理序列,您认为一般情况是什么? 然而,也许你对这样的事情感兴趣:要将你的列表转换为一个Sting,请执行以下操作

>>> ''.join(['A','B','B','A','A','B'])
'ABBAAB'
由于列表元素本身就是字符串,这与

>>> ''.join(['ABB','AAB'])
'ABBAAB'

大多数好的数据库绑定都允许您直接存储值语义Python对象(例如PyMongo)。如果数据库只接受字符串,则需要选择序列化格式;在Python中,这通常意味着在pickle(快速但非人类可读)和YaML(较慢、人类可读、独立于语言)之间进行选择

泡菜:

>>> from cPickle import dumps, loads
>>> dumps(['A', 'BB', 'CCC'])
"(lp1\nS'A'\naS'BB'\np2\naS'CCC'\np3\na."
>>> loads(dumps(['A', 'BB', 'CCC']))
['A', 'BB', 'CCC']
亚马尔:


如果您使用的是SQL数据库,并且希望能够在列表中进行查询,那么标准化数据库并每行存储一个列表项是解决此问题的经典方法。

如果不知道您使用的是什么数据库,则很难给出准确的答案。如果数据库只接受字符串,则可以使用标准库中的
repr()
ast.literal\u eval
,组合速度非常快:

In [26]: from yaml import dump, load

In [27]: import ast

In [28]: l= ['A', 'BB', 'CCC']

In [29]: load(dump(l))
Out[29]: ['A', 'BB', 'CCC']

In [30]: ast.literal_eval(repr(l))
Out[30]: ['A', 'BB', 'CCC']

In [31]: %timeit load(dump(l))
1000 loops, best of 3: 1.03 ms per loop

In [32]: %timeit ast.literal_eval(repr(l))
10000 loops, best of 3: 32.6 us per loop

加入列表并在数据库中存储字符串值并没有错

如果您想存储不同长度的项目,例如[a]、[AA]、[B]、[AB'],则始终可以选择一些分隔符,例如“+”。当然,这假设您知道给定的分隔符不能是列表中任何项目的一部分

我想说的是,对于许多场景,上述解决方案已经足够好了,而且它们没有“这不是pythonic”的问题

然而,这比python的情况要复杂得多。有一个网站提供了一些如何组织数据的建议。您可以将数据模型重新构造为“第一范式”(1NF),这意味着您可以创建一个单独的表来存储项目(可能还有订单信息),并通过FK将其与当前表链接

这样做可以避免一系列问题,例如项目重新排序、项目计数等。但另一方面,这可能会使您的查询更加昂贵,因为此解决方案需要数据库连接来从数据库获取数据。在许多情况下,当为应用程序设计数据模型时,数据库是有意执行的,主要是因为优化问题


总而言之,您应该尝试预测您希望如何使用您的数据,并让这些知识选择一个建议的解决方案(或者可能是不同的!)。

请告诉我们,并提供示例输入和输出,因为问题不太清楚序列中的字符列表是字符串的定义;因此,从
列表
转换为字符串似乎是合乎逻辑的,如果没有其他东西,pythonic就是合乎逻辑的。那么你觉得它有什么不和谐的地方呢?如果这是你的实际代码,用你正在使用的代码编辑你的问题,也许有些地方可以改进。我并不觉得这是不和谐的——就我的目的而言,这很好。但是,如果我的字符中包含字符串或更复杂的结构(即列表中的列表),那么这就不起作用了。我认为pickle可能有点过分了,因为字符串可以很容易地拆分回列表中——其实你不需要这样做,因为字符串是序列(尽管是不可变的)因此,如果原始海报想要的只是能够按顺序访问字符串中的字符,那么列表将是多余的。
In [26]: from yaml import dump, load

In [27]: import ast

In [28]: l= ['A', 'BB', 'CCC']

In [29]: load(dump(l))
Out[29]: ['A', 'BB', 'CCC']

In [30]: ast.literal_eval(repr(l))
Out[30]: ['A', 'BB', 'CCC']

In [31]: %timeit load(dump(l))
1000 loops, best of 3: 1.03 ms per loop

In [32]: %timeit ast.literal_eval(repr(l))
10000 loops, best of 3: 32.6 us per loop