You signed in with another tab or window.Reload to refresh your session.You signed out in another tab or window.Reload to refresh your session.You switched accounts on another tab or window.Reload to refresh your session.Dismiss alert
RethinkDB is the first open-source scalable database built for realtime applications. It exposes a new database access model -- instead of polling for changes, the developer can tell the database to continuously push updated query results to applications in realtime. RethinkDB allows developers to build scalable realtime apps in a fraction of the time with less effort.
Installation
$ pip install rethinkdb
Note: this package is the extracted driver of RethinkDB's original python driver.
Quickstart
The main difference with the previous driver (except the name of the package) is we arenot importing RethinkDB asr. If you would like to useRethinkDB's python driver as a drop in replacement, you should do the following:
The following examples demonstrate how to use the driver in each mode.
Default mode (blocking I/O)
The driver's default mode of operation is to use blocking I/O, i.e. standard Pythonsockets. This example shows how to create a table, populate with data, and get everydocument.
fromrethinkdbimportrconnection=r.connect(db='test')r.table_create('marvel').run(connection)marvel_heroes=r.table('marvel')marvel_heroes.insert({'id':1,'name':'Iron Man','first_appearance':'Tales of Suspense #39'}).run(connection)forheroinmarvel_heroes.run(connection):print(hero['name'])
Asyncio mode
Asyncio mode is compatible with Python ≥ 3.4, which is when asyncio wasintroduced into the standard library.
importasynciofromrethinkdbimportr# Native coroutines are supported in Python ≥ 3.5. In Python 3.4, you should# use the @asyncio.couroutine decorator instead of "async def", and "yield from"# instead of "await".asyncdefmain():r.set_loop_type('asyncio')connection=awaitr.connect(db='test')awaitr.table_create('marvel').run(connection)marvel_heroes=r.table('marvel')awaitmarvel_heroes.insert({'id':1,'name':'Iron Man','first_appearance':'Tales of Suspense #39' }).run(connection)# "async for" is supported in Python ≥ 3.6. In earlier versions, you should# call "await cursor.next()" in a loop.cursor=awaitmarvel_heroes.run(connection)asyncforheroincursor:print(hero['name'])asyncio.get_event_loop().run_until_complete(main())
Gevent mode
importgeventfromrethinkdbimportrdefmain():r.set_loop_type('gevent')connection=r.connect(db='test')r.table_create('marvel').run(connection)marvel_heroes=r.table('marvel')marvel_heroes.insert({'id':1,'name':'Iron Man','first_appearance':'Tales of Suspense #39' }).run(connection)forheroinmarvel_heroes.run(connection):print(hero['name'])gevent.joinall([gevent.spawn(main)])
Tornado mode
Tornado mode is compatible with Tornado < 5.0.0. Tornado 5 is not supported.
fromrethinkdbimportrfromtornadoimportgenfromtornado.ioloopimportIOLoop@gen.coroutinedefmain():r.set_loop_type('tornado')connection=yieldr.connect(db='test')yieldr.table_create('marvel').run(connection)marvel_heroes=r.table('marvel')yieldmarvel_heroes.insert({'id':1,'name':'Iron Man','first_appearance':'Tales of Suspense #39' }).run(connection)cursor=yieldmarvel_heroes.run(connection)while (yieldcursor.fetch_next()):hero=yieldcursor.next()print(hero['name'])IOLoop.current().run_sync(main)
Trio mode
fromrethinkdbimportrimporttrioasyncdefmain():r.set_loop_type('trio')asyncwithtrio.open_nursery()asnursery:asyncwithr.open(db='test',nursery=nursery)asconn:awaitr.table_create('marvel').run(conn)marvel_heroes=r.table('marvel')awaitmarvel_heroes.insert({'id':1,'name':'Iron Man','first_appearance':'Tales of Suspense #39' }).run(conn)# "async for" is supported in Python ≥ 3.6. In earlier versions, you should# call "await cursor.next()" in a loop.cursor=awaitmarvel_heroes.run(conn)asyncwithcursor:asyncforheroincursor:print(hero['name'])trio.run(main)
The Trio mode also supports a database connection pool. You can modify the example aboveas follows:
fromrethinkdbimportrfromtwisted.internetimportreactor,defer@defer.inlineCallbacksdefmain():r.set_loop_type('twisted')connection=yieldr.connect(db='test')yieldr.table_create('marvel').run(connection)marvel_heroes=r.table('marvel')yieldmarvel_heroes.insert({'id':1,'name':'Iron Man','first_appearance':'Tales of Suspense #39' }).run(connection)cursor=yieldmarvel_heroes.run(connection)while (yieldcursor.fetch_next()):hero=yieldcursor.next()print(hero['name'])main().addCallback(lambdad:print("stopping")orreactor.stop())reactor.run()
Misc
To help the migration from rethinkdb<2.4 we introduced a shortcut which can easily replace the oldimport rethinkdb as r import withfrom rethinkdb import r.
Run tests
In theMakefile you can find three different test commands:test-unit,test-integration andtest-remote. As RethinkDB has dropped the support of Windows, we would like to ensure that those of us who are using Windows for development can still contribute. Because of this, we support running integration tests against Digital Ocean Droplets as well.
Before you run any test, make sure that you install the requirements.
$ pip install -r requirements.txt$ make prepare
Running unit tests
$ make test-unit
Running integration tests
To run integration tests locally, make sure you intstalled RethinkDB
$ make test-integration
Running remote integration tests
To run the remote tests, you need to have a Digital Ocean account and an API key.
Remote test will create a new temporary SSH key and a Droplet for you until the tests are finished.
Available environment variables
Variable name
Default value
DO_TOKEN
N/A
DO_SIZE
512MB
DO_REGION
sfo2
$ pip install paramiko python-digitalocean$export DO_TOKEN=<YOUR_TOKEN>$ make test-remote
Contributing
Hurray! You reached this section which means, that you would like to contribute. Please read our contributing guide lines and feel free to open a pull request.