diff --git a/.gitignore b/.gitignore index 8acbd12..5328e2c 100644 --- a/.gitignore +++ b/.gitignore @@ -153,4 +153,5 @@ dmypy.json ### Default user directories export/ +tmp/ .pfbudget diff --git a/alembic/versions/287fe9e6682a_add_relationships.py b/alembic/versions/287fe9e6682a_add_relationships.py new file mode 100644 index 0000000..13a669b --- /dev/null +++ b/alembic/versions/287fe9e6682a_add_relationships.py @@ -0,0 +1,109 @@ +"""Add relationships + +Revision ID: 287fe9e6682a +Revises: d3534f493239 +Create Date: 2022-12-03 16:43:39.633382+00:00 + +""" +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "287fe9e6682a" +down_revision = "d3534f493239" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint( + "fk_categorized_id_originals", + "categorized", + schema="transactions", + type_="foreignkey", + ) + op.create_foreign_key( + op.f("fk_categorized_id_originals"), + "categorized", + "originals", + ["id"], + ["id"], + source_schema="transactions", + referent_schema="transactions", + ondelete="CASCADE", + ) + op.drop_constraint( + "fk_notes_id_originals", "notes", schema="transactions", type_="foreignkey" + ) + op.create_foreign_key( + op.f("fk_notes_id_originals"), + "notes", + "originals", + ["id"], + ["id"], + source_schema="transactions", + referent_schema="transactions", + ondelete="CASCADE", + ) + op.drop_constraint( + "fk_tags_id_originals", "tags", schema="transactions", type_="foreignkey" + ) + op.create_foreign_key( + op.f("fk_tags_id_originals"), + "tags", + "originals", + ["id"], + ["id"], + source_schema="transactions", + referent_schema="transactions", + ondelete="CASCADE", + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint( + op.f("fk_tags_id_originals"), "tags", schema="transactions", type_="foreignkey" + ) + op.create_foreign_key( + "fk_tags_id_originals", + "tags", + "originals", + ["id"], + ["id"], + source_schema="transactions", + referent_schema="transactions", + ) + op.drop_constraint( + op.f("fk_notes_id_originals"), + "notes", + schema="transactions", + type_="foreignkey", + ) + op.create_foreign_key( + "fk_notes_id_originals", + "notes", + "originals", + ["id"], + ["id"], + source_schema="transactions", + referent_schema="transactions", + ) + op.drop_constraint( + op.f("fk_categorized_id_originals"), + "categorized", + schema="transactions", + type_="foreignkey", + ) + op.create_foreign_key( + "fk_categorized_id_originals", + "categorized", + "originals", + ["id"], + ["id"], + source_schema="transactions", + referent_schema="transactions", + ) + # ### end Alembic commands ### diff --git a/pfbudget/db/model.py b/pfbudget/db/model.py index 2701bf8..385dabd 100644 --- a/pfbudget/db/model.py +++ b/pfbudget/db/model.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from sqlalchemy import ( BigInteger, Enum, @@ -7,7 +9,13 @@ from sqlalchemy import ( String, Text, ) -from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, MappedAsDataclass +from sqlalchemy.orm import ( + DeclarativeBase, + Mapped, + mapped_column, + MappedAsDataclass, + relationship, +) from decimal import Decimal from typing import Annotated, Optional @@ -66,16 +74,26 @@ class Original(Base): bank: Mapped[bankfk] amount: Mapped[money] - -idfk = Annotated[int, mapped_column(BigInteger, ForeignKey(Original.id))] + category: Mapped[Category] = relationship(back_populates="original") + note: Mapped[Note] = relationship(back_populates="original") + tags: Mapped[set[Tag]] = relationship( + back_populates="original", cascade="all, delete-orphan", passive_deletes=True + ) -class Categorized(Base): +idfk = Annotated[ + int, mapped_column(BigInteger, ForeignKey(Original.id, ondelete="CASCADE")) +] + + +class Category(Base): __tablename__ = "categorized" id: Mapped[idfk] = mapped_column(primary_key=True) category: Mapped[str] + original: Mapped[Original] = relationship(back_populates="category") + class Note(Base): __tablename__ = "notes" @@ -83,6 +101,8 @@ class Note(Base): id: Mapped[idfk] = mapped_column(primary_key=True) note: Mapped[str] + original: Mapped[Original] = relationship(back_populates="note") + class Nordigen(Base): __tablename__ = "nordigen" @@ -93,8 +113,10 @@ class Nordigen(Base): invert: Mapped[Optional[bool]] -class Tags(Base): +class Tag(Base): __tablename__ = "tags" id: Mapped[idfk] = mapped_column(primary_key=True) tag: Mapped[str] = mapped_column(primary_key=True) + + original: Mapped[Original] = relationship(back_populates="tags")