Python Twisted 的数据库
有一个API可以让Twisted应用程序以可扩展的方式与数据库进行交流:twisted.enterprise.dbapi
让人困惑的是,应该选择哪个数据库呢?
这个数据库将会有一个Twisted应用,主要是进行数据插入和更新,查询的次数相对较少。同时,还有一些只读的客户端直接访问数据库进行查询。
(这些只读用户不一定是在查询Twisted应用插入的数据;并不是说数据库被当作消息队列来使用)
我理解的情况是——希望能得到纠正或建议——如下:
- Postgres是个很不错的数据库,但几乎所有的Python绑定——而且有很多让人困惑的选择——都已经不再维护了。
- 对于Postgres,有psycopg2这个库,但它在连接池等方面有很多自己的做法;这和Twisted的异步数据库连接池能否很好地共存呢?
- SQLLite是个适合小项目的好数据库,但如果用在多用户环境下,它会锁住整个数据库,这样在我设想的使用模式下性能会很差;而且它对列值的类型处理机制也不同?
- MySQL在被Oracle收购后,谁还会想用它或者用它的分支呢?
- 还有其他选择吗?
3 个回答
你可以考虑使用像mongodb或couchdb这样的nosql数据库,配合twisted框架。使用nosql数据库进行扩展会比用mysql或postgres简单得多。
有一个叫做 txpostgres
的库,它可以直接替代 twisted.enterprise.dbapi
。与使用线程池和阻塞数据库输入输出不同,txpostgres
是完全异步的,充分利用了 psycopg2
内置的异步功能。
我们在一家大公司中使用这个库,效果非常好。此外,它还在不断更新和开发——我们最近报告的一个bug很快就被解决了。
可扩展性
twisted.enterprise.adbapi
并不一定是一个可以让你以可扩展的方式与数据库沟通的接口。可扩展性是一个需要单独解决的问题。twisted.enterprise.adbapi
主要的功能是让你可以使用 DB-API 2.0 模块,而不会像通常那样造成阻塞。
Postgres
没错。这是正确的答案。我认为并不是所有的 Python 绑定都是被遗弃的,比如 psycopg2 似乎还在积极维护。实际上,他们刚刚添加了一些新的绑定,用于异步访问,Twisted 可能最终会提供一个接口。
SQLite3 也很不错。你可能想让你的应用能够使用 Postgres 或 SQLite3;例如,即使你想在 Postgres 上部署,单元测试在 SQLite3 上运行会更顺利。
其他数据库?
很难确定其他类型的数据库(比如非关系型的)是否比 Postgres 更适合你的应用。这很大程度上取决于你要存储的具体数据和你需要执行的查询。如果你的数据库中有有趣的关系,Postgres 似乎是一个不错的选择。不过,如果你的查询都像“SELECT foo, bar FROM baz”这样简单,可能会有更简单、更高效的选择。