rethinkdb-python:一个驱动通吃六种运行模式

RethinkDB 是第一个为实时应用打造的开源数据库。传统数据库需要应用层反复轮询才能感知数据变化,RethinkDB 的思路不同:它把更新后的查询结果主动推送给应用,免去了手动轮询的开销。构建实时协作工具、实时仪表盘这类场景,开发周期能缩短不少。

rethinkdb-python 是它的官方 Python 驱动独立包,从 RethinkDB 2.4 版本的原始驱动中抽出并独立维护。pip 一行装完,同时支持同步阻塞和五种异步 I/O 模式,算是 Python 生态里对异步框架覆盖最全的数据库驱动之一。

正文顶部截图

一个驱动,六种模式

这个驱动最显眼的特点是对异步框架的覆盖。除默认的阻塞 I/O 模式(标准 Python socket),还原生支持五种异步框架:

  • Asyncio:Python 3.5 以上原生协程,async for 遍历查询结果,异步上下文管理器自动管理连接生命周期
  • Gevent:基于 greenlet 的协程方案,适合已有 Gevent 技术栈的项目
  • Tornado:兼容 Tornado 5.0 以下版本,gen.coroutine 装饰器写法
  • Trio:结构化并发的代表框架,驱动层面额外提供了 ConnectionPool 连接池
  • Twisted:经典的 defer.inlineCallbacks 回调风格

切换模式只需要一行 r.set_loop_type(),核心的增删改查逻辑完全不用动。对需要同时维护同步和异步代码路径的项目来说,这一点省了不少适配工作。

以 asyncio 模式为例,完整的建表、插入、查询流程:

import asyncio
from rethinkdb import r

async def main():
    async with await r.connect(db='test') as connection:
        await r.table_create('marvel').run(connection)
        await r.table('marvel').insert({
            'id': 1,
            'name': 'Iron Man',
            'first_appearance': 'Tales of Suspense #39'
        }).run(connection)

        cursor = await r.table('marvel').run(connection)
        async for hero in cursor:
            print(hero['name'])

r.set_loop_type('asyncio')
asyncio.run(main())

异步上下文管理器在代码块结束时自动关闭连接,不用手动调 close()。几个异步框架的 API 风格各自契合框架本身的惯用写法,不会让人觉得生硬。

和旧版驱动的区别

RethinkDB 2.4 把 Python 驱动从主仓库中独立出来,形成了这个项目。老版本用户迁移成本很低,主要变化是推荐 from rethinkdb import r 代替 import rethinkdb as r,两种导入方式都兼容。官方还专门加了一个迁移快捷方式,确保旧代码不用改动就能继续跑。

实际表现

RethinkDB 的核心卖点是 changefeed:数据库直接向应用端推送数据变更,不用引入 Redis Pub/Sub 或 Kafka 这类外部消息中间件。在这个驱动里,异步模式下的 changefeed 实现更贴合直觉,asyncio 的 async for 遍历实时数据流,代码读起来就像处理本地集合。

测试基础设施做得比较周到,分了三个层级:make test-unit 跑单元测试,make test-integration 跑本地集成测试,make test-remote 则是通过 DigitalOcean API 自动创建临时 Droplet 跑远程集成测试。远程测试会生成临时 SSH 密钥和虚拟机,跑完自动销毁。RethinkDB 官方已经停止支持 Windows,这套机制让 Windows 上的开发者也能参与贡献。

README区域截图

适合谁用

Star 数 64,不算热门。但 RethinkDB 的用户群体比较固定,这个驱动作为官方维护的独立包,对现有用户来说是核心依赖。特别是技术栈里同时跑了多个异步框架的团队,一个驱动通吃所有模式,能少装好几个依赖包。

RethinkDB 的定位跟 Redis、Kafka 不是直接竞争关系,它提供的是另外一条路:数据库层直接支持实时推送,架构上省掉中间人。这个 Python 驱动让这种设计落了地,用起来也不重。

安装就一行:

pip install rethinkdb

贡献指南写得直白,开头那句 “Hurray! You reached this section” 挺能反映社区的态度。如果你在用 RethinkDB,或者对「数据库主动推送」这个方向感兴趣,可以装一个试试。

d this section" 挺能反映社区的态度。如果你在用 RethinkDB,或者对「数据库主动推送」这个方向感兴趣,可以装一个试试。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐