Skip to content
Opinionated persistence with PostgreSQL
Branch: develop
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci
.globality
build.python-library/docker-base Generating build files through globality-build Dec 18, 2018
microcosm_postgres
.ackrc
.bumpversion.cfg
.dockerignore Generating build files through globality-build Dec 18, 2018
.gitignore
CHANGES.md
CONTRIBUTING.md
Dockerfile.template
LICENSE
MANIFEST.in GLOB-21814: Circle 1->2 (#42) Jul 6, 2018
README.md
entrypoint.sh
setup.cfg
setup.py
tox.ini

README.md

microcosm-postgres

Opinionated persistence with PostgreSQL.

Circle CI

Usage

This project includes example models and persistence stores. Assuming the testing database exists (see below), the following demonstrates basic usage:

from microcosm.api import create_object_graph
from microcosm_postgres.context import SessionContext, transaction
from microcosm_postgres.example import Company

# create the object graph
graph = create_object_graph(name="example", testing=True)

# wire up the persistence layer to the (testing) database
[company_store] = graph.use("company_store")

# set up a session
with SessionContext(graph) as context:

    # drop and create database tables; *only* do this for testing
    context.recreate_all()

    with transaction():
        # create a model
        company = company_store.create(Company(name="Acme"))

    # prints 1
    print company_store.count()

Convention

Basics:

  • Databases are segmented by microservice; no service can see another's database
  • Every microservice connects to its database with a username and a password
  • Unit testing uses an real (non-mock) database with a non-overlapping name
  • Database names and usernames are generated according to convention

Models:

  • Persistent models use a SQLAlchemy declarative base class
  • Persistent operations pass through a unifying Store layer
  • Persistent operations favor explicit queries and deletes over automatic relations and cascades

Configuration

To change the database host:

config.postgres.host = "myhost"

To change the database password:

config.postgres.password = "mysecretpassword"

Test Setup

Tests (and automated builds) act as the "example" microservice and need a cooresponding database and user:

createuser example
createdb -O example example_test_db

Note that production usage should always create the user with a password. For example:

echo "CREATE ROLE example WITH LOGIN ENCRYPTED PASSWORD 'secret';" | psql

Automated test do not enforce that a password is set because many development environments (OSX, Circle CI) configure pg_hba.conf for trusted login from localhost.

You can’t perform that action at this time.