Peewee now supports CockroachDB

cockroachdb

I'm pleased to announce that Peewee now supports CockroachDB (CRDB), the distributed, horizontally-scalable SQL database. I'm excited about this release, because it's now quite easy to get up-and-running with a robust SQL database that can scale out with minimal effort (documentation).

Here is how you configure a CockroachDatabase instance:

from playhouse.cockroachdb import CockroachDatabase

db = CockroachDatabase('my_app', user='root', host='10.1.0.8', port=26257)

CRDB conveniently provides a very similar SQL dialect to Postgres, which has been well-supported in Peewee for many years, allowing you to use features like jsonb and arrays, in addition to the regular complement of field-types. Additionally, CRDB speaks the same wire-protocol as Postgres, so it works out-of-the-box using the popular psycopg2 driver.

Example model class using jsonb and CRDB's UUID primary-key type:

from peewee import *
from playhouse.cockroachdb import JSONField
from playhouse.cockroachdb import UUIDKeyField


class UserProfile(Model):
    id = UUIDKeyField()  # Auto-generated UUID primary-key.
    email = TextField()
    signup_date = DateTimeField()  # Date/time with timezone.
    preferences = JSONField(default=dict)  # Free-form JSON data.

CRDB provides a client-side transaction retry API, which Peewee supports using a helper-method. To use client-side retries with Peewee and CRDB, provide a callable that executes your transactional SQL and pass it to the run_transaction() method:

from playhouse.cockroachdb import CockroachDatabase

db = CockroachDatabase('my_app')

def create_user_and_token(username, timestamp):
    # The run_transaction() helper accepts a callable that contains your
    # transactional SQL statements. The transaction will be automatically
    # retried until it can be committed.
    def callback(db_ref):
        user = User.create(username=username, created=timestamp)
        token = Token.create(
            user=user,
            expires=timestamp + timedelta(days=1),
            code=generate_random_token())
        return user, token.code

    # Upon success, the return-value of the callback is passed back to
    # the caller. If an error, such as a constraint violation, occurs,
    # the error is propagated back up the call-stack.
    return db.run_transaction(callback, max_attempts=10)

user, code = create_user_and_token('huey@kitten', datetime.now())

Check out the CockroachDB installation docs for instructions on getting up-and-running.

Links

Comments (0)


Commenting has been closed, but please feel free to contact me