Skip to main content

af-fastapi-db-txs

FastAPI integration for allfly.db.session.TransactionContext (from af-db-session): request-scoped read-write and read-only database sessions with automatic commit/rollback, so route handlers never manage session lifecycle themselves.

No hidden global state, no DI framework coupling. Every component here takes its TransactionContext and session factories as explicit arguments — your app owns instantiation and lifecycle, and wires the same TransactionContext instance into the middleware and any read-only dependencies it builds. auto_configure_database (from af-db-session) builds all of them for you in one call, if you don't need custom factories.

Installation

pip install af-fastapi-db-txs
# or with Poetry:
poetry add af-fastapi-db-txs

Wiring it into your app

Your app should hold exactly one TransactionContext instance for the life of the process. The easiest way to get one — along with its matching DatabaseSessionFactory/ RODatabaseSessionFactory — is auto_configure_database, from af-db-session:

from allfly.db.session import auto_configure_database, DatabaseAutoConfigurationProperties
from allfly.fastapi.db_txs import TransactionMiddleware, make_read_only_transaction

db = auto_configure_database(db_settings, DatabaseAutoConfigurationProperties(build_read_replica=True))

app.add_middleware(
    TransactionMiddleware,
    transaction_context=db.transaction_context,
    session_factory=db.session_factory,
)

ReadOnlyTransaction = make_read_only_transaction(db.ro_session_factory, db.transaction_context)

If you'd rather assemble the pieces yourself (e.g. a custom DatabaseSessionFactory subclass), build each one directly instead — TransactionMiddleware and make_read_only_transaction only need a TransactionContext and the relevant factory, however you got them:

from allfly.db.session import TransactionContext, build_session_factory, build_ro_session_factory

transaction_context = TransactionContext()
session_factory = build_session_factory(db_settings)
ro_session_factory = build_ro_session_factory(db_settings)

Using it in routes

Write routes (RW by default — the middleware opens a session for every request):

@router.post("/users")
def create_user(user_repo: UserRepositoryDI):
    return user_repo.save(user)  # commits automatically on a 2xx/3xx response

Read-only routes (route or router-level, targets your read replica instead):

@router.get("/users", dependencies=[ReadOnlyTransaction])
def search_users(user_repo: UserRepositoryDI) -> list[UserResponse]:
    ...

Wherever your app resolves a Session for its repositories, call transaction_context.get_session() — it returns the RO session if one is active for the current request, otherwise the RW session opened by the middleware, otherwise None.

Scripts and background tasks

For code outside a FastAPI request (management scripts, workers), use the context managers directly instead of the middleware/dependency — either via the db object from auto_configure_database:

with db.transaction():
    user_repo = UserRepository(db.transaction_context.get_session())
    user_repo.save(user)
    # commits on success, rolls back on exception

with db.read_transaction():
    result = repo.find(...)

or, if you built the pieces yourself, the same methods on TransactionContext directly:

with transaction_context.transaction(session_factory):
    user_repo = UserRepository(transaction_context.get_session())
    user_repo.save(user)

with transaction_context.read_transaction(ro_session_factory):
    result = repo.find(...)

If a single DatabaseAutoConfiguration is truly the only one in the process (no multiple databases, no multiple apps sharing the interpreter — e.g. in a pytest session), af-db-session also has an opt-in allfly.db.session.default module for a bare with transaction(): — see af-db-session's docs for when that tradeoff is worth it.

Why explicit injection?

This library has no knowledge of any dependency-injection framework. TransactionMiddleware and make_read_only_transaction both take a TransactionContext and session factory instances directly — if your app uses a DI container, wire these components into it yourself; if it doesn't, pass the instances around as plain module-level values. Either way, the one invariant that matters is sharing the same TransactionContext instance across the middleware, any read-only dependencies, and your app's own session-resolution code — its ContextVars are what tie a request's session together.

Download files

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

Source Distribution

af_fastapi_db_txs-0.0.1.tar.gz (4.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

af_fastapi_db_txs-0.0.1-py3-none-any.whl (5.8 kB view details)

Uploaded Python 3

File details

Details for the file af_fastapi_db_txs-0.0.1.tar.gz.

File metadata

  • Download URL: af_fastapi_db_txs-0.0.1.tar.gz
  • Upload date:
  • Size: 4.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for af_fastapi_db_txs-0.0.1.tar.gz
Algorithm Hash digest
SHA256 b261c27d1b1aa2f09b189b76ab92133d63ccf2c94ba4c99302198affe7df6e13
MD5 80c14a63a0f2ff170f3f50b9c72be112
BLAKE2b-256 6b2bd15bf6d561504632420320fd65c011adbcf205c9a85a9ece0b76829a7578

See more details on using hashes here.

Provenance

The following attestation bundles were made for af_fastapi_db_txs-0.0.1.tar.gz:

Publisher: af-fastapi-db-txs-publish.yml on travelallfly/allfly-py-libs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file af_fastapi_db_txs-0.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for af_fastapi_db_txs-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8c30b26e08a4f72c44c087a376046c8c31924d2dccc1e6b4bd6c5cb819ec7628
MD5 1ac1285c62e57b031ed562d5397759b3
BLAKE2b-256 9f6c542b87853947367b0642d4cf8fda1792223e8b60322b93183c1fff35d10e

See more details on using hashes here.

Provenance

The following attestation bundles were made for af_fastapi_db_txs-0.0.1-py3-none-any.whl:

Publisher: af-fastapi-db-txs-publish.yml on travelallfly/allfly-py-libs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.0.3

2 files

0.0.2

2 files

This release

0.0.1 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page