Peewee now supports 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
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
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
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.
Commenting has been closed, but please feel free to contact me