From f076d2e841a11342ef5ddc8f9efdd42a46811190 Mon Sep 17 00:00:00 2001 From: Mathias Scheider Date: Fri, 4 Sep 2026 14:41:29 +0200 Subject: [PATCH] db engine --- .env.template | 1 + .gitignore | 3 +++ src/db.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 .env.template create mode 100644 src/db.py diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..178a635 --- /dev/null +++ b/.env.template @@ -0,0 +1 @@ +DATABASE_URL_DEFAULT = "sqlite:///finanz.db" diff --git a/.gitignore b/.gitignore index 505a3b1..303cc54 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ wheels/ # Virtual environments .venv + +# Environment variables +.env diff --git a/src/db.py b/src/db.py new file mode 100644 index 0000000..310e399 --- /dev/null +++ b/src/db.py @@ -0,0 +1,33 @@ +#!/bin/python + +import os +from collections.abc import Generator +from contextlib import contextmanager + +from sqlalchemy import Engine, create_engine +from sqlalchemy.orm import Session, sessionmaker + +DATABASE_URL_DEFAULT = "sqlite:///finanz.db" + + +def get_engine() -> Engine: + url = os.environ.get("DATABASE_URL", DATABASE_URL_DEFAULT) + return create_engine(url) + + +def get_sessionmaker(engine: Engine | None = None) -> sessionmaker[Session]: + engine = engine or get_engine() + return sessionmaker(bind=engine) + + +@contextmanager +def get_session(engine: Engine | None = None) -> Generator[Session]: + session_factory = get_sessionmaker(engine) + session = session_factory() + try: + yield session + except Exception: + session.rollback() + raise + finally: + session.close()