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

use*_*844 13 python database flat-file

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

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

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

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

huo*_*uon 8

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


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

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

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

最后,如果您的数据包含更先进的对象(例如递归的字典,或复杂的自定义数据类型),然后使用内建的二进制序列化技术之一(pickle,shelve等等)可能是合适的,但是,YAML可以处理许多的这些东西(包括递归数据结构).

一些一般观点:

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


lvc*_*lvc 6

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

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

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