"""Tietokantamallit — SQLAlchemy 2.0, Mapped-tyypitys, ForeignKey-relaatiot.""" from datetime import datetime from sqlalchemy import String, Text, DateTime, ForeignKey, create_engine from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, sessionmaker DATABASE_URL = "sqlite:///./app.db" engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) class Base(DeclarativeBase): pass class Author(Base): """Kirjoittaja — nimi, sähköposti ja bio.""" __tablename__ = "authors" id: Mapped[int] = mapped_column(primary_key=True, index=True) name: Mapped[str] = mapped_column(String(255)) email: Mapped[str] = mapped_column(String(255), unique=True) bio: Mapped[str | None] = mapped_column(Text, default=None) posts: Mapped[list["Post"]] = relationship(back_populates="author") class Post(Base): """Blogipostaus — otsikko, sisältö, kirjoittaja, julkaisuaika ja tila.""" __tablename__ = "posts" id: Mapped[int] = mapped_column(primary_key=True, index=True) title: Mapped[str] = mapped_column(String(255)) content: Mapped[str] = mapped_column(Text) author_id: Mapped[int] = mapped_column(ForeignKey("authors.id")) published_at: Mapped[datetime | None] = mapped_column(DateTime, default=None) status: Mapped[str] = mapped_column(String(20), default="draft") author: Mapped["Author"] = relationship(back_populates="posts") Base.metadata.create_all(bind=engine)