Django/Python应用的数据库引擎选择
我正在开发一个Python/Django的应用程序。这个应用的核心逻辑是用Python写的,而网页界面则是用Django来处理的。我打算用ZMQ来实现核心部分和界面部分之间的通信。
我使用的是一个时间序列数据库,后台用PostgreSQL来存储字符串数据,还有另一个时间序列工具来存储时间序列数据。因此,我在时间序列数据库中已经需要使用PostgreSQL了。不过,我还需要另一个数据库来存储其他类型的数据,所以我开始使用PostgreSQL。
我的一个团队成员建议使用sqlite3。我对这两个数据库都没有使用经验,我知道它们各有优缺点,所以我想了解一下这两个数据库之间的主要区别,以及它们各自适合的使用场景。
2 个回答
我们使用的是PostgreSQL,而我们的团队之前一直在用SQLite3。不过,当你把数据导入数据库时,经常会出现“数据库被锁定!”这样的提示。
SQLite3的优点:
它很小,正如你所说的,不需要设置服务器。
在models.py中,max_length的限制并不严格。你设置max_length=10,但如果你在这个字段里放了100个字符,SQLite3不会抱怨,也不会截断这些字符。
但是,PostgreSQL比SQLite3快。如果你使用SQLite3,某一天想要迁移到PostgreSQL,这就会成为一个问题,因为SQLite3不会截断字符串,而PostgreSQL会对此提出警告!
我觉得这要看你的需求,这个问题只有你自己能回答。我认为“设置起来更简单”这种说法有点傻。你们都是软件专业人士,应该用适合的工具,学会使用这些工具。比如在Ubuntu上,设置一个开发用的Postgres数据库几乎只需要一个命令。
你首先要问自己,SQL是否适合我们正在做的事情?如果不适合,那就换别的(不过你可能想选择其他的框架,而我说这话是因为我自己不太用Django的关系型数据库),如果适合,那就继续吧。
好消息是,在Django中,如果你真的不想在开发环境中设置Postgres,你可以通过设置文件在开发和生产环境之间切换数据库类型。当然,这假设你在Django中没有使用任何Postgres特有的功能,也就是说,你只是使用ORM和Django中不依赖于特定数据库的功能和库。就你来说,这听起来应该不是问题。
不过我建议你在开发中使用SQLite时,还是要在Postgres上进行充分的测试。你永远不知道会出现什么集成问题,而且性能特性差别很大。如果这样让你感觉好一些,谷歌在他们的Google App Engine SDK中就使用SQLite来模拟开发时的App Engine数据存储。
总之,首先看看SQLite的官方使用案例。此外,查看实现限制,看看是否有任何限制会影响你的需求。
SQLite的一般优点:
- 设置简单,轻量级,适合单用户或低流量数据库
- 可以轻松嵌入到其他应用中,比如游戏
- 便于携带
- 速度够快,能完成任务
- 适合简单的情况,比如小系统或替代直接的磁盘访问
Postgres是一个更强大的数据库,设计用来支持各种不同规模的应用,适合使用关系型数据库的场景。一般来说,它几乎具备SQLite的所有功能,还有更多,但显然设置起来更复杂,不太适合快速嵌入,而且携带性稍差。换句话说,不是那么轻便 :)
你可以看看这个Postgres的功能矩阵。
这里有一个更直接的比较,可以让你一目了然。
Postgres的一般优点:
- 设计为多用户使用
- 有很多有用的工具,包括备份和复制等功能
- 全面的数据类型和数据库内部操作的功能集,比如存储过程等
- 如果你对SQL有一定了解并且使用得当,可以很好地扩展
- 强调并完全实现了ACID合规性和事务处理
总结一下 - 如果你想为长期发展做打算并且有信心,就用Postgres。如果你不在乎,那就用SQLite吧。如果你想享受两者的优点,可以通过Django的设置在不使用特定数据库功能的情况下切换数据库。