【问题标题】:How do I store a dict/list in a database?如何在数据库中存储字典/列表?
【发布时间】:2011-01-19 15:40:45
【问题描述】:

如果我有一个充满嵌套内容的字典,我如何将它作为字符串存储在数据库中?然后,当我准备好解析时,将其转换回字典?

编辑:我只想将其转换为字符串...然后再转换回字典。

【问题讨论】:

    标签: python database string list dictionary


    【解决方案1】:

    选项:

    1) 酸洗

    2) XML

    3) JSON

    其他我确定。可移植性对您的意义有很大关系。

    【讨论】:

    • 我只是想把它转换成一个字符串……然后再转换成一个字典。
    • 如果您不关心可移植性,请使用酸洗 (docs.python.org/library/pickle.html) 功能。选择更快的“cpickle”变体。
    【解决方案2】:

    你为什么不使用pickle模块的一些序列化/反序列化?

    http://docs.python.org/library/pickle.html

    【讨论】:

      【解决方案3】:

      最好,在您规定的条件下:

      import cPickle
         ...
      thestring = cPickle.dumps(thedict, -1)
      

      -1 确保最有效的序列化并生成 binary 字符串(任意字节字符串)。如果你需要一个 ascii 字符串(因为例如一些 Unicode 转码将会发生并且你不能将字段的类型从 TEXT 切换到 BLOB),避免使用 -1 ,但你的效率会降低。

      以后要从字符串中取回dict,无论哪种情况,

      thenewdict = cPickle.loads(thestring)
      

      【讨论】:

      • 这适用于 utf-8,对吧? (只是,我的意思是默认字符串。)
      • utf-8 在键和值中都很好,但不能保证thestring 会尊重utf-8 编码(很可能不会:它只是字节!)。如果这是一个问题,您必须省略 -1 参数(“执行最快、最有效和最简洁的序列化”是 不是默认值但需要显式 -1.. . 实际上有多种原因,但这是其中之一;-)。
      • 出于安全原因,我将避免使用-1 :) 并正常进行。反正我不在乎速度z。
      • 如果您不关心速度、大小和功能完整性(能够pickle 其类定义__slots__ 但不定义__getstate__ 的对象),那么旧的遗留协议(您会得到什么)避免-1 很好)。
      【解决方案4】:

      有许多序列化方法,JSON 可读、相当紧凑、本机支持且可移植。我更喜欢它而不是 pickle,因为后者可以执行任意代码并可能引入安全漏洞,并且因为它的可移植性。

      根据您的数据布局,您还可以使用 ORM 将数据直接映射到数据库结构中。

      【讨论】:

        【解决方案5】:

        你有两个选择

        • 使用标准的序列化格式(json、xml、yaml、...)

          • 优点:您可以使用任何可以解析这些格式的语言进行访问(在最坏的情况下,您可以编写自己的解析器)
          • 缺点:保存和加载数据可能较慢(这主要取决于实现)
        • 使用 cPickle:

          • 优点:易于使用、快速且原生的 python 方式进行序列化。
          • 缺点:只有基于 python 的应用才能访问数据。

        【讨论】:

          猜你喜欢
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          • 1970-01-01
          • 2015-11-26
          • 2015-05-09
          • 2014-09-17
          相关资源
          最近更新 更多