Python:在数据库中存储对象状态的最佳方法是什么?

3

我需要将实例(或至少它们的状态)存储在数据库中。这个想法是,我应该能够按需重新创建实例。由于我定义了类,我可以选择如何存储数据。

考虑以下继承图:

                    A
                   / \
                  B   C
                 /\   /\
                D  E F  ...

这个想法是实例可以属于其中任何一个类,并且可以存储其他对象(我完全控制设计)。我的第一个想法是仅在字典中存储状态,将字典转储为json并存储在数据库中。在运行时,从数据库加载json,将其转换为字典,创建一个传递字典的对象进行设置等等... 我不确定这是否是一个好方法,还有可能出现其他问题。我已经遇到了一个问题,如果使用myobj.dict,则实际上不会获取所有类父属性... 有什么建议吗?

2
它必须是一个数据库吗?一个简单而愚蠢的解决方案就是将它们pickle到文件中。 - Daenyth
http://www.python.org/workshops/1997-10/proceedings/shprentz.html - Robert Harvey
2
http://docs.python.org/library/shelve.html - Robert Harvey
1
没有限制?你考虑过使用pickle/unpickle吗? - muratgu
3个回答

4
有几种方法可供选择。根据你提供的信息,我们无法确定最适合你的方法。
  • 你可以使用ORM,比如SQLAlchemy
  • 你可以使用对象数据库,比如ZODB
  • 你可以将对象序列化并存储在任何关系数据库或数据存储中,包括SQLiteNoSQL数据库,还有Python标准库中的shelve模块
这些是我能想到的方法。只有你才能确定哪种方法最符合你的要求和意图。

这是一个很好的答案。它还应该提到 shelve,它几乎没有学习曲线,并且包含在标准库中(无需安装第三方模块)。 - Raymond Hettinger
@RaymondHettinger - 您是正确的。我想我认为它是第三个选项的一部分,但我会编辑它以反映shelve,谢谢。 - gomad
1
最终我选择了zodb来满足我的需求,虽然shelve也可能同样适用,但似乎不适用于非常大的数据集。 - noobzie

2

shelve模块是存储可通过键检索的实例最简单的方法。它会自动对数据进行序列化和反序列化,并负责读写文件。


0

我的建议是围绕你的状态设计一个对象模型,并使用 Python 的 ORM 工具包。这里提到了几个 - What are some good Python ORM solutions?

我认为最好不要重复造轮子。你可以使用 ORM 工具包来存储状态或实际的对象实例树。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接