什么时候在Python中使用数据库是合适的

时间:2012-06-09 02:16:45

标签: python database flat-file

我正在为游戏制作一个小插件,它需要在播放器上存储信息:

  • 用户名
  • 的IP地址
  • 游戏中的位置
  • 来自该用户名的IP或备用IP地址的备用用户名列表

我刚才读了一篇文章说,除非我存储了大量无法在ram中保存的信息,否则我不应该使用数据库。所以我尝试在python中使用shelve模块,但我不确定这是不是一个好主意。

你们什么时候认为使用数据库是个好主意,何时以其他方式更好地存储信息,除了数据库和平面文件数据库之外,还有哪些其他方式来存储信息。

2 个答案:

答案 0 :(得分:8)

最重要的是,除非您特别需要性能或高可靠性,否则请尽量使您的代码最简单/最容易编写。


如果您的数据非常结构化(并且您了解SQL或愿意学习),那么使用sqlite3之类的数据库可能是合适的。 (您应该忽略关于数据库大小和RAM的注释:有时数据库适用于非常小的数据集,因为数据的结构如何。)

如果数据相对简单,并且您不需要数据库(通常)具有的可靠性,那么在程序运行时将其存储在一个内置数据类型中可能没问题。

如果您希望存储在磁盘上的数据是人类可读的(并且可编辑,需要付出一些努力),那么像JSON(内置json模块)这样的格式很不错,因为基本的Python对象没有任何努力序列化。如果数据不那么简单,那么YAML本质上是JSON的扩展版本(PyYAML非常好。)。类似地,您可以使用CSV文件(csv模块),虽然这不如JSON或YAML好,或者只是自定义文本格式(但这需要很多工作才能获得错误处理,所以实施得很好。)

最后,如果您的数据包含更多高级对象(例如递归字典或复杂的自定义数据类型),那么使用内置二进制序列化技术之一(pickleshelve等)可能是合适的,但是,YAML可以处理许多这些事情(包括递归数据结构)。

一些一般观点:

  • 纯文本格式很好,因为它们允许轻松调整值并且调试/测试很容易
  • 二进制格式很好,因为它们意味着无需额外努力就无法调整值(这并不是说它们无法调整),文件大小较小(可能不相关)

答案 1 :(得分:6)

假设“数据库”是指“关系数据库” - 即使像SQLite这样的嵌入式数据库也会比纯文本文件带来一些开销。但是,与滚动自己相比,有时候这种开销是值得的。

您需要问的最大问题是您是否存储关系数据 - 标准化和SQL查询之类的内容是否有意义。如果您需要使用连接在多个表中查找数据,您当然应该使用关系数据库 - 这就是 。另一方面,如果您只需要根据主键查找一个表,则可能需要CSV文件。如果您持久存在的是您在程序中使用的对象,那么Pickle和shelve非常有用 - 如果您可以将相关的魔术方法添加到现有类中并期望它们都有意义。

当然“你不应该使用数据库,除非你有大量的数据”并不是最好的建议 - 如果你使用的话,数据量会更多地用于你可能使用的数据库。例如,SQLite不适合Stackoverflow大小的东西 - 但是,对于有五个用户的东西,MySQL或Postgres几乎肯定会有点过分。