Skip to main content

Python driver library for the RethinkDB database server.

Project description

RethinkDB Python driver

PyPI version Build Status Codacy Badge Codacy Badge

Overview

What is RethinkDB?

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 are not importing RethinkDB as r. If you would like to use RethinkDB's python driver as a drop in replacement, you should do the following:

from rethinkdb import r

connection = r.connect(db='test')

Blocking and Non-blocking I/O

This driver supports blocking I/O (i.e. standard Python sockets) as well as non-blocking I/O through multiple async frameworks:

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 Python sockets. This example shows how to create a table, populate with data, and get every document.

from rethinkdb import r

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)

for hero in marvel_heroes.run(connection):
    print(hero['name'])

Asyncio mode

Asyncio mode is compatible with Python ≥ 3.4, which is when asyncio was introduced into the standard library.

import asyncio
from rethinkdb import r

# 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".
async def main():
    r.set_loop_type('asyncio')
    connection = await r.connect(db='test')

    await r.table_create('marvel').run(connection)

    marvel_heroes = r.table('marvel')
    await marvel_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 = await marvel_heroes.run(connection)
    async for hero in cursor:
        print(hero['name'])

asyncio.get_event_loop().run_until_complete(main())

Gevent mode

import gevent
from rethinkdb import r

def main():
    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)

    for hero in marvel_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.

from rethinkdb import r
from tornado import gen
from tornado.ioloop import IOLoop

@gen.coroutine
def main():
    r.set_loop_type('tornado')
    connection = yield r.connect(db='test')

    yield r.table_create('marvel').run(connection)

    marvel_heroes = r.table('marvel')
    yield marvel_heroes.insert({
        'id': 1,
        'name': 'Iron Man',
        'first_appearance': 'Tales of Suspense #39'
    }).run(connection)

    cursor = yield marvel_heroes.run(connection)
    while (yield cursor.fetch_next()):
        hero = yield cursor.next()
        print(hero['name'])

IOLoop.current().run_sync(main)

Trio mode

from rethinkdb import r
import trio

async def main():
    r.set_loop_type('trio')
    async with trio.open_nursery() as nursery:
        async with r.open(db='test', nursery=nursery) as conn:
            await r.table_create('marvel').run(conn)
            marvel_heroes = r.table('marvel')
            await marvel_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 = await marvel_heroes.run(conn)
            async with cursor:
                async for hero in cursor:
                    print(hero['name'])

trio.run(main)

The Trio mode also supports a database connection pool. You can modify the example above as follows:

db_pool = r.ConnectionPool(db='test', nursery=nursery)
async with db_pool.connection() as conn:
    ...
await db_pool.close()

Twisted mode

from rethinkdb import r
from twisted.internet import reactor, defer

@defer.inlineCallbacks
def main():
    r.set_loop_type('twisted')
    connection = yield r.connect(db='test')

    yield r.table_create('marvel').run(connection)

    marvel_heroes = r.table('marvel')
    yield marvel_heroes.insert({
        'id': 1,
        'name': 'Iron Man',
        'first_appearance': 'Tales of Suspense #39'
    }).run(connection)

    cursor = yield marvel_heroes.run(connection)
    while (yield cursor.fetch_next()):
        hero = yield cursor.next()
        print(hero['name'])

main().addCallback(lambda d: print("stopping") or reactor.stop())
reactor.run()

Misc

To help the migration from rethinkdb<2.4 we introduced a shortcut which can easily replace the old import rethinkdb as r import with from rethinkdb import r.

Run tests

In the Makefile you can find three different test commands: test-unit, test-integration and test-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

New features

Github's Issue tracker is ONLY used for reporting bugs. NO NEW FEATURE ACCEPTED! Use spectrum for supporting features.

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rethinkdb_iantocristian-2.4.8.post2.tar.gz (161.0 kB view details)

Uploaded Source

Built Distribution

rethinkdb_iantocristian-2.4.8.post2-py2.py3-none-any.whl (161.3 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file rethinkdb_iantocristian-2.4.8.post2.tar.gz.

File metadata

  • Download URL: rethinkdb_iantocristian-2.4.8.post2.tar.gz
  • Upload date:
  • Size: 161.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.56.2 CPython/3.9.1

File hashes

Hashes for rethinkdb_iantocristian-2.4.8.post2.tar.gz
Algorithm Hash digest
SHA256 e16763c22a4d451d917e4686a4b31c6bf7d879466adaba08c08cad70c0242e3f
MD5 5bc5491e400a2bf0410bc67d42cf56db
BLAKE2b-256 2b403996b408041ee5bba08864fc8f968fe901453b3ad47210f002bd202e9789

See more details on using hashes here.

File details

Details for the file rethinkdb_iantocristian-2.4.8.post2-py2.py3-none-any.whl.

File metadata

  • Download URL: rethinkdb_iantocristian-2.4.8.post2-py2.py3-none-any.whl
  • Upload date:
  • Size: 161.3 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.56.2 CPython/3.9.1

File hashes

Hashes for rethinkdb_iantocristian-2.4.8.post2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 115f9b400eabc197dd8cb99d96d5298488348ebe39d0c889fb6639268b9c48f2
MD5 e8b83e55f97ea97bc35fb4f0746500b3
BLAKE2b-256 656e723934426258ba850d5e738e355f6acc21a315722493d1ed1bc4bbe13d64

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page