Skip to main content

Python package for eventsourcing with SQLAlchemy.

Project description

Event Sourcing in Python with SQLAlchemy

This package supports using the Python eventsourcing library with SQLAlchemy.

Installation

Use pip to install the stable distribution from the Python Package Index. Please note, it is recommended to install Python packages into a Python virtual environment.

$ pip install eventsourcing_sqlalchemy

Synopsis

To use SQLAlchemy with your Python eventsourcing application, use the topic eventsourcing_sqlalchemy.factory:Factory as the INFRASTRUCTURE_FACTORY environment variable, and set an SQLAlchemy database URL as the value of environment variable SQLALCHEMY_URL.

First define a domain model and application, in the usual way.

from eventsourcing.application import Application
from eventsourcing.domain import Aggregate, event


class World(Aggregate):
    def __init__(self):
        self.history = []

    @event("SomethingHappened")
    def make_it_so(self, what):
        self.history.append(what)


class Worlds(Application):
    is_snapshotting_enabled = True

    def create_world(self):
        world = World()
        self.save(world)
        return world.id

    def make_it_so(self, world_id, what):
        world = self.repository.get(world_id)
        world.make_it_so(what)
        self.save(world)

    def get_world_history(self, world_id):
        world = self.repository.get(world_id)
        return world.history

Set environment variables INFRASTRUCTURE_FACTORY and SQLALCHEMY_URL. See the SQLAlchemy documentation for more information about SQLAlchemy Database URLs.

import os

os.environ.update({
    "INFRASTRUCTURE_FACTORY": "eventsourcing_sqlalchemy.factory:Factory",
    "SQLALCHEMY_URL": "sqlite:///:memory:",
})

Construct and use the application.

# Construct the application.
app = Worlds()

# Call application command methods.
world_id = app.create_world()
app.make_it_so(world_id, "dinosaurs")
app.make_it_so(world_id, "trucks")
app.make_it_so(world_id, "internet")

# Call application query methods.
history = app.get_world_history(world_id)
assert history == ["dinosaurs", "trucks", "internet"]    

These settings can be used with others supported by the library, for example to enable application-level compression and encryption of stored events, set COMPRESSOR_TOPIC and CIPHER_KEY.

from eventsourcing.cipher import AESCipher


# Generate a cipher key (keep this safe).
cipher_key = AESCipher.create_key(num_bytes=32)

# Set environment variables.
os.environ.update({
    "COMPRESSOR_TOPIC": "zlib",
    "CIPHER_KEY": cipher_key,
})

# Construct the application.
app = Worlds()

We can see the application is using the SQLAlchemy infrastructure, and that compression and encryption are enabled, by checking the attributes of the application object.

from eventsourcing_sqlalchemy.datastore import SQLAlchemyDatastore
from eventsourcing_sqlalchemy.factory import Factory
from eventsourcing_sqlalchemy.recorders import SQLAlchemyAggregateRecorder
from eventsourcing_sqlalchemy.recorders import SQLAlchemyApplicationRecorder
from eventsourcing_sqlalchemy.models import StoredEventRecord
from eventsourcing_sqlalchemy.models import SnapshotRecord
import zlib

assert isinstance(app.factory, Factory)
assert isinstance(app.factory.datastore, SQLAlchemyDatastore)
assert isinstance(app.events.recorder, SQLAlchemyApplicationRecorder)
assert isinstance(app.snapshots.recorder, SQLAlchemyAggregateRecorder)
assert issubclass(app.events.recorder.events_record_cls, StoredEventRecord)
assert issubclass(app.snapshots.recorder.events_record_cls, SnapshotRecord)
assert isinstance(app.mapper.cipher, AESCipher)
assert app.mapper.compressor == zlib

For more information, please refer to the Python eventsourcing library and the SQLAlchemy project.

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

eventsourcing-sqlalchemy-0.1.1.tar.gz (9.9 kB view details)

Uploaded Source

Built Distribution

eventsourcing_sqlalchemy-0.1.1-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

Details for the file eventsourcing-sqlalchemy-0.1.1.tar.gz.

File metadata

  • Download URL: eventsourcing-sqlalchemy-0.1.1.tar.gz
  • Upload date:
  • Size: 9.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.11 CPython/3.10.0 Darwin/19.6.0

File hashes

Hashes for eventsourcing-sqlalchemy-0.1.1.tar.gz
Algorithm Hash digest
SHA256 6eb73d4a54a1f0dc81decd5258366ee406a15cb612cb3d2350c969b5df0c235c
MD5 6367c805c56da22ca6c4ece9adda966f
BLAKE2b-256 6710da7e885aa8a1559e7229620e44a7929abe1f432e0e92668046f30c60ead0

See more details on using hashes here.

File details

Details for the file eventsourcing_sqlalchemy-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for eventsourcing_sqlalchemy-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 061e8f39deb8f8dec823106b5a3bc4d2d6fbb88e44e1510bdcc4d364bfd4775d
MD5 c09322648200f64ff3dc2c45c7bbcaef
BLAKE2b-256 0b2bbd3fab0cd68116f014a83cff845c80f88a5330fe0a9dad061fb2d927e31a

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