Initial FastAPI + SQLite + Alembic

This commit is contained in:
ShaBle
2026-02-06 17:06:35 +01:00
commit 465aa0f1c1
29 changed files with 826 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
from fastapi_demo.app.db.session import Base # noqa: F401
from fastapi_demo.app.db import models # noqa: F401

View File

@@ -0,0 +1,13 @@
from __future__ import annotations
from typing import Generator
from fastapi_demo.app.db.session import SessionLocal
from sqlalchemy.orm import Session
def get_db() -> Generator[Session, None, None]:
db = SessionLocal()
try:
yield db
finally:
db.close()

View File

@@ -0,0 +1,53 @@
from __future__ import annotations
from sqlalchemy import String, DateTime, Text, ForeignKey, Integer, text
from sqlalchemy.orm import Mapped, mapped_column, relationship
from datetime import datetime
from fastapi_demo.app.db.session import Base
class Asset(Base):
__tablename__ = "assets"
id: Mapped[str] = mapped_column(String, primary_key=True, index=True)
name: Mapped[str] = mapped_column(String, nullable=False)
serial: Mapped[str | None] = mapped_column(String, nullable=True)
status: Mapped[str] = mapped_column(String, nullable=False)
revision: Mapped[int] = mapped_column(
Integer,
nullable=False,
server_default=text("0"),
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), nullable=False
)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), nullable=False
)
events: Mapped[list["AssetEvent"]] = relationship(
"AssetEvent",
back_populates="asset",
cascade="all, delete-orphan",
passive_deletes=True,
)
class AssetEvent(Base):
__tablename__ = "asset_events"
id: Mapped[str] = mapped_column(String, primary_key=True, index=True)
asset_id: Mapped[str] = mapped_column(
String, ForeignKey("assets.id", ondelete="CASCADE"), index=True
)
from_status: Mapped[str] = mapped_column(String, nullable=False)
to_status: Mapped[str] = mapped_column(String, nullable=False)
at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)
note: Mapped[str | None] = mapped_column(Text, nullable=True)
asset: Mapped["Asset"] = relationship("Asset", back_populates="events")

View File

@@ -0,0 +1,24 @@
from __future__ import annotations
from pathlib import Path
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from fastapi_demo.app.core.config import settings
# sorgt dafür, dass ./data existiert (für sqlite datei)
Path("data").mkdir(exist_ok=True)
engine = create_engine(
settings.DATABASE_URL,
connect_args={"check_same_thread": False}
if settings.DATABASE_URL.startswith("sqlite")
else {},
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
def dispose_engine() -> None:
engine.dispose()