diff --git a/the_works/schema.sql b/the_works/schema.sql deleted file mode 100644 index 25d3e49..0000000 --- a/the_works/schema.sql +++ /dev/null @@ -1,132 +0,0 @@ -DROP TABLE IF EXISTS "AutorHrsg_Index"; -DROP TABLE IF EXISTS "AutorInnen_und_Hrsg"; -DROP TABLE IF EXISTS "TextGenres_Index"; -DROP TABLE IF EXISTS "WerkGenres_Index"; -DROP TABLE IF EXISTS "Genres"; -DROP TABLE IF EXISTS "Reihen"; -DROP TABLE IF EXISTS "Sprachen"; -DROP TABLE IF EXISTS "Tete"; -DROP TABLE IF EXISTS "Textformen"; -DROP TABLE IF EXISTS "Verlage"; -DROP TABLE IF EXISTS "Veroeffentlichungen_Index"; -DROP TABLE IF EXISTS "Werke"; -DROP TABLE IF EXISTS "Werksformen"; - -CREATE TABLE IF NOT EXISTS "AutorHrsg_Index" ( - "ID" INTEGER, - "Werk" INTEGER NOT NULL, - "AutorIn_oder_Hrsg" INTEGER NOT NULL DEFAULT 1, - PRIMARY KEY("ID" AUTOINCREMENT), - FOREIGN KEY("AutorIn_oder_Hrsg") REFERENCES "AutorInnen_und_Hrsg"("ID"), - FOREIGN KEY("Werk") REFERENCES "Werke"("ID") -); -CREATE TABLE IF NOT EXISTS "AutorInnen_und_Hrsg" ( - "ID" INTEGER, - "Name" TEXT NOT NULL, - "Funktion" TEXT NOT NULL, - PRIMARY KEY("ID" AUTOINCREMENT) -); -CREATE TABLE IF NOT EXISTS "TextGenres_Index" ( - "ID" INTEGER, - "Text" INTEGER NOT NULL, - "Genre" INTEGER NOT NULL, - PRIMARY KEY("ID" AUTOINCREMENT), - FOREIGN KEY("Genre") REFERENCES "Genres"("ID"), - FOREIGN KEY("Text") REFERENCES "Texte"("ID") -); -CREATE TABLE IF NOT EXISTS "WerkGenres_Index" ( - "ID" INTEGER, - "Werk" INTEGER NOT NULL, - "Genre" INTEGER NOT NULL, - PRIMARY KEY("ID" AUTOINCREMENT), - FOREIGN KEY("Genre") REFERENCES "Genres"("ID"), - FOREIGN KEY("Werk") REFERENCES "Werke"("ID") -); -CREATE TABLE IF NOT EXISTS "Genres" ( - "ID" INTEGER, - "Genre" TEXT NOT NULL, - PRIMARY KEY("ID" AUTOINCREMENT) -); -CREATE TABLE IF NOT EXISTS "Reihen" ( - "ID" INTEGER, - "Reihentitel" TEXT NOT NULL, - "Verlag" TEXT, - PRIMARY KEY("ID" AUTOINCREMENT), - FOREIGN KEY("Verlag") REFERENCES "Verlage"("ID") -); -CREATE TABLE IF NOT EXISTS "Sprachen" ( - "ID" INTEGER, - "Sprache" TEXT NOT NULL, - PRIMARY KEY("ID" AUTOINCREMENT) -); -CREATE TABLE IF NOT EXISTS "Texte" ( - "ID" INTEGER, - "Titel" TEXT NOT NULL, - "Untertitel" TEXT, - "Reihe" INTEGER, - "Textform" INTEGER, - "Originalsprache" INTEGER, - PRIMARY KEY("ID" AUTOINCREMENT), - FOREIGN KEY("Originalsprache") REFERENCES "Sprachen"("ID"), - FOREIGN KEY("Reihe") REFERENCES "Reihen"("ID"), - FOREIGN KEY("Textform") REFERENCES "Textformen"("ID") -); -CREATE TABLE IF NOT EXISTS "Textformen" ( - "ID" INTEGER, - "Textform" TEXT NOT NULL, - PRIMARY KEY("ID" AUTOINCREMENT) -); -CREATE TABLE IF NOT EXISTS "Verlage" ( - "ID" INTEGER, - "Verlag" TEXT NOT NULL, - PRIMARY KEY("ID" AUTOINCREMENT) -); -CREATE TABLE IF NOT EXISTS "Veröffentlichungen_Index" ( - "ID" INTEGER, - "Text" INTEGER NOT NULL, - "Werk" INTEGER NOT NULL, - "neuer Titel" TEXT, - "neuer Untertitel" TEXT, - "Veröffentlicht als" INTEGER NOT NULL, - PRIMARY KEY("ID" AUTOINCREMENT), - FOREIGN KEY("Text") REFERENCES "Texte"("ID"), - FOREIGN KEY("Veröffentlicht als") REFERENCES "AutorInnen_und_Hrsg"("ID"), - FOREIGN KEY("Werk") REFERENCES "Werke"("ID") -); -CREATE TABLE IF NOT EXISTS "Werke" ( - "ID" INTEGER, - "Werkstitel" TEXT NOT NULL, - "Werksuntertitel" TEXT, - "Werksform" INTEGER, - "Verlag" INTEGER, - "Reihe" INTEGER, - "Reihennummer" TEXT, - "Erscheinungsdatum" TEXT, - "ISBN_13" TEXT, - "ISBN_10" TEXT, - "ISSN" TEXT, - "Preis" TEXT, - "Titelbild" BLOB, - "Klappentext" TEXT, - "Anmerkungen" TEXT, - PRIMARY KEY("ID" AUTOINCREMENT), - FOREIGN KEY("Reihe") REFERENCES "Reihen"("ID"), - FOREIGN KEY("Verlag") REFERENCES "Verlage"("ID"), - FOREIGN KEY("Werksform") REFERENCES "Werksformen"("ID") -); -CREATE TABLE IF NOT EXISTS "Werksformen" ( - "ID" INTEGER, - "Werksform" TEXT NOT NULL, - "Medium" TEXT, - PRIMARY KEY("ID" AUTOINCREMENT) -); -CREATE VIEW Meine_Buecher AS - SELECT DISTINCT w.Werkstitel - , a.Name - , a.Funktion - FROM Werke w - INNER JOIN AutorHrsg_Index i - ON w.ID = i.Werk - INNER JOIN AutorInnen_und_Hrsg a - ON i.AutorIn_oder_Hrsg = a.ID - WHERE a.ID < 4; diff --git a/tmp.md b/tmp.md index ea88a9c..4a2947a 100644 --- a/tmp.md +++ b/tmp.md @@ -26,16 +26,16 @@ Welche Tabellen habe ich? - x Originalsprache zu Sprache - x Reihentitel zu Reihe - x Werks[unter]titel zu [Unter]Titel +- x Werksform.Medium löschen -- sollte column Werk.Werksform required sein? +- x AutorIn_und_Hrsg in zwei Tabellen aufteilen: Pseudonym (nur ich), Herausgeber (egal wer) +- in der alten Tabelle hatte TR die ID 1, PJ die 3 -> muss ich in den VÖ-Zeilen noch anpassen + +- x sollte column Werk.Werksform required sein? -> prolly schon; hab's im input field vom Modal auch schon umgesetzt - braucht table Werk eine column AutorInHrsg? +- x eigene Tabelle "Bild" mit ID (PK) / Werk (FK) / Bild / ggf. Anmerkungen - -Was ich vllt. noch ändern will: - -- VÖ-Daten als Datentyp TIMESTAMP abspeichern - -View "Meine Bücher": +View "Meine Bücher": CREATE VIEW Meine_Buecher AS SELECT DISTINCT w.Werkstitel @@ -47,3 +47,10 @@ INNER JOIN AutorHrsg_Index i INNER JOIN AutorInnen_und_Hrsg a ON i.AutorIn_oder_Hrsg = a.ID WHERE a.ID < 4 + + +Checkmark Entities (yes/no) + +- ✔ / ✘ (geschwungen, schwarz auf transparent) +- ✅ / ❎ (weiß auf grün) +- (kein yes) / ❌ (rot auf transparent) diff --git a/utils/schema.sql b/utils/schema.sql new file mode 100644 index 0000000..a63b9f3 --- /dev/null +++ b/utils/schema.sql @@ -0,0 +1,138 @@ +BEGIN TRANSACTION; +DROP TABLE IF EXISTS "Genre"; +CREATE TABLE "Genre" ( + "ID" INTEGER, + "Genre" TEXT NOT NULL, + PRIMARY KEY("ID" AUTOINCREMENT) +); +DROP TABLE IF EXISTS "Herausgeber"; +CREATE TABLE "Herausgeber" ( + "ID" INTEGER, + "Name" TEXT NOT NULL, + PRIMARY KEY("ID" AUTOINCREMENT) +); +DROP TABLE IF EXISTS "Pseudonym"; +CREATE TABLE "Pseudonym" ( + "ID" INTEGER, + "Pseudonym" TEXT NOT NULL, + PRIMARY KEY("ID" AUTOINCREMENT) +); +DROP TABLE IF EXISTS "Reihe"; +CREATE TABLE "Reihe" ( + "ID" INTEGER, + "Titel" TEXT NOT NULL, + "Verlag" TEXT, + PRIMARY KEY("ID" AUTOINCREMENT), + FOREIGN KEY("Verlag") REFERENCES "Verlag"("ID") +); +DROP TABLE IF EXISTS "Sprache"; +CREATE TABLE "Sprache" ( + "ID" INTEGER, + "Sprache" TEXT NOT NULL, + PRIMARY KEY("ID" AUTOINCREMENT) +); +DROP TABLE IF EXISTS "Text"; +CREATE TABLE "Text" ( + "ID" INTEGER, + "Titel" TEXT NOT NULL, + "Untertitel" TEXT, + "Reihe" INTEGER, + "Textform" INTEGER, + "Sprache" INTEGER, + PRIMARY KEY("ID" AUTOINCREMENT), + FOREIGN KEY("Reihe") REFERENCES "Reihe"("ID"), + FOREIGN KEY("Sprache") REFERENCES "Sprache"("ID"), + FOREIGN KEY("Textform") REFERENCES "Textform"("ID") +); +DROP TABLE IF EXISTS "Text_Genre"; +CREATE TABLE "Text_Genre" ( + "Text" INTEGER, + "Genre" INTEGER, + PRIMARY KEY("Text","Genre"), + FOREIGN KEY("Genre") REFERENCES "Genre"("ID"), + FOREIGN KEY("Text") REFERENCES "Text"("ID") +); +DROP TABLE IF EXISTS "Textform"; +CREATE TABLE "Textform" ( + "ID" INTEGER, + "Textform" TEXT NOT NULL, + PRIMARY KEY("ID" AUTOINCREMENT) +); +DROP TABLE IF EXISTS "Titelbild"; +CREATE TABLE "Titelbild" ( + "ID" INTEGER, + "Mimetype" TEXT NOT NULL, + "Dateiname" TEXT NOT NULL, + "Dateigroesse" INTEGER NOT NULL, + "Breite" INTEGER NOT NULL, + "Hoehe" INTEGER NOT NULL, + "Bild" BLOB NOT NULL, + "Thumbnail" BLOB NOT NULL, + "sha256" TEXT NOT NULL UNIQUE, + PRIMARY KEY("ID" AUTOINCREMENT) +); +DROP TABLE IF EXISTS "Verlag"; +CREATE TABLE "Verlag" ( + "ID" INTEGER, + "Verlag" TEXT NOT NULL, + PRIMARY KEY("ID" AUTOINCREMENT) +); +DROP TABLE IF EXISTS "Veroeffentlichung"; +CREATE TABLE "Veroeffentlichung" ( + "ID" INTEGER, + "Text" INTEGER NOT NULL, + "Werk" INTEGER NOT NULL, + "AltTitel" TEXT, + "AltUntertitel" TEXT, + "Pseudonym" INTEGER NOT NULL, + PRIMARY KEY("ID" AUTOINCREMENT), + FOREIGN KEY("Pseudonym") REFERENCES "Pseudonym"("ID"), + FOREIGN KEY("Text") REFERENCES "Text"("ID"), + FOREIGN KEY("Werk") REFERENCES "Werk"("ID") +); +DROP TABLE IF EXISTS "Werk"; +CREATE TABLE "Werk" ( + "ID" INTEGER, + "Titel" TEXT NOT NULL, + "Untertitel" TEXT, + "Werksform" INTEGER, + "Verlag" INTEGER, + "Reihe" INTEGER, + "Reihennummer" TEXT, + "Erscheinungsdatum" TEXT, + "ISBN_13" TEXT, + "ISBN_10" TEXT, + "ISSN" TEXT, + "Preis" TEXT, + "Titelbild" INTEGER, + "Klappentext" TEXT, + "Anmerkungen" TEXT, + PRIMARY KEY("ID" AUTOINCREMENT), + FOREIGN KEY("Reihe") REFERENCES "Reihe"("ID"), + FOREIGN KEY("Titelbild") REFERENCES "Titelbild"("ID"), + FOREIGN KEY("Verlag") REFERENCES "Verlag"("ID"), + FOREIGN KEY("Werksform") REFERENCES "Werksform"("ID") +); +DROP TABLE IF EXISTS "Werk_Genre"; +CREATE TABLE "Werk_Genre" ( + "Werk" INTEGER, + "Genre" INTEGER, + PRIMARY KEY("Werk","Genre"), + FOREIGN KEY("Genre") REFERENCES "Genre"("ID"), + FOREIGN KEY("Werk") REFERENCES "Werk"("ID") +); +DROP TABLE IF EXISTS "Werk_Herausgeber"; +CREATE TABLE "Werk_Herausgeber" ( + "Herausgeber" INTEGER, + "Werk" INTEGER, + PRIMARY KEY("Herausgeber","Werk"), + FOREIGN KEY("Herausgeber") REFERENCES "Herausgeber"("ID"), + FOREIGN KEY("Werk") REFERENCES "Werk"("ID") +); +DROP TABLE IF EXISTS "Werksform"; +CREATE TABLE "Werksform" ( + "ID" INTEGER, + "Werksform" TEXT NOT NULL, + PRIMARY KEY("ID" AUTOINCREMENT) +); +COMMIT; diff --git a/utils/sqlacodegen_output.py b/utils/sqlacodegen_output.py new file mode 100644 index 0000000..86497dd --- /dev/null +++ b/utils/sqlacodegen_output.py @@ -0,0 +1,181 @@ +from typing import List, Optional + +from sqlalchemy import Column, ForeignKey, Integer, LargeBinary, Table, Text +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship + +class Base(DeclarativeBase): + pass + + +class Genre(Base): + __tablename__ = 'Genre' + + Genre: Mapped[str] = mapped_column(Text) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + + Text_: Mapped[List['Text_']] = relationship('Text_', secondary='Text_Genre', back_populates='Genre_') + Werk: Mapped[List['Werk']] = relationship('Werk', secondary='Werk_Genre', back_populates='Genre_') + + +class Herausgeber(Base): + __tablename__ = 'Herausgeber' + + Name: Mapped[str] = mapped_column(Text) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + + Werk: Mapped[List['Werk']] = relationship('Werk', secondary='Werk_Herausgeber', back_populates='Herausgeber_') + + +class Pseudonym(Base): + __tablename__ = 'Pseudonym' + + Pseudonym: Mapped[str] = mapped_column(Text) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + + Veroeffentlichung: Mapped[List['Veroeffentlichung']] = relationship('Veroeffentlichung', back_populates='Pseudonym1') + + +class Sprache(Base): + __tablename__ = 'Sprache' + + Sprache: Mapped[str] = mapped_column(Text) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + + Text_: Mapped[List['Text_']] = relationship('Text_', back_populates='Sprache1') + + +class Textform(Base): + __tablename__ = 'Textform' + + Textform: Mapped[str] = mapped_column(Text) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + + Text_: Mapped[List['Text_']] = relationship('Text_', back_populates='Textform1') + + +class Titelbild(Base): + __tablename__ = 'Titelbild' + + Mimetype: Mapped[str] = mapped_column(Text) + Dateiname: Mapped[str] = mapped_column(Text) + Dateigroesse: Mapped[int] = mapped_column(Integer) + Breite: Mapped[int] = mapped_column(Integer) + Hoehe: Mapped[int] = mapped_column(Integer) + Bild: Mapped[bytes] = mapped_column(LargeBinary) + Thumbnail: Mapped[bytes] = mapped_column(LargeBinary) + sha256: Mapped[str] = mapped_column(Text, unique=True) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + + Werk: Mapped[List['Werk']] = relationship('Werk', back_populates='Titelbild1') + + +class Verlag(Base): + __tablename__ = 'Verlag' + + Verlag: Mapped[str] = mapped_column(Text) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + + Reihe: Mapped[List['Reihe']] = relationship('Reihe', back_populates='Verlag1') + Werk: Mapped[List['Werk']] = relationship('Werk', back_populates='Verlag1') + + +class Werksform(Base): + __tablename__ = 'Werksform' + + Werksform: Mapped[str] = mapped_column(Text) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + + Werk: Mapped[List['Werk']] = relationship('Werk', back_populates='Werksform1') + + +class Reihe(Base): + __tablename__ = 'Reihe' + + Titel: Mapped[str] = mapped_column(Text) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + Verlag_: Mapped[Optional[str]] = mapped_column('Verlag', ForeignKey('Verlag.ID')) + + Verlag1: Mapped[Optional['Verlag']] = relationship('Verlag', back_populates='Reihe') + Text_: Mapped[List['Text_']] = relationship('Text_', back_populates='Reihe1') + Werk: Mapped[List['Werk']] = relationship('Werk', back_populates='Reihe1') + + +class Text_(Base): + __tablename__ = 'Text' + + Titel: Mapped[str] = mapped_column(Text) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + Untertitel: Mapped[Optional[str]] = mapped_column(Text) + Reihe_: Mapped[Optional[int]] = mapped_column('Reihe', ForeignKey('Reihe.ID')) + Textform_: Mapped[Optional[int]] = mapped_column('Textform', ForeignKey('Textform.ID')) + Sprache_: Mapped[Optional[int]] = mapped_column('Sprache', ForeignKey('Sprache.ID')) + + Genre_: Mapped[List['Genre']] = relationship('Genre', secondary='Text_Genre', back_populates='Text_') + Reihe1: Mapped[Optional['Reihe']] = relationship('Reihe', back_populates='Text_') + Sprache1: Mapped[Optional['Sprache']] = relationship('Sprache', back_populates='Text_') + Textform1: Mapped[Optional['Textform']] = relationship('Textform', back_populates='Text_') + Veroeffentlichung: Mapped[List['Veroeffentlichung']] = relationship('Veroeffentlichung', back_populates='Text2') + + +class Werk(Base): + __tablename__ = 'Werk' + + Titel: Mapped[str] = mapped_column(Text) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + Untertitel: Mapped[Optional[str]] = mapped_column(Text) + Werksform_: Mapped[Optional[int]] = mapped_column('Werksform', ForeignKey('Werksform.ID')) + Verlag_: Mapped[Optional[int]] = mapped_column('Verlag', ForeignKey('Verlag.ID')) + Reihe_: Mapped[Optional[int]] = mapped_column('Reihe', ForeignKey('Reihe.ID')) + Reihennummer: Mapped[Optional[str]] = mapped_column(Text) + Erscheinungsdatum: Mapped[Optional[str]] = mapped_column(Text) + ISBN_13: Mapped[Optional[str]] = mapped_column(Text) + ISBN_10: Mapped[Optional[str]] = mapped_column(Text) + ISSN: Mapped[Optional[str]] = mapped_column(Text) + Preis: Mapped[Optional[str]] = mapped_column(Text) + Titelbild_: Mapped[Optional[int]] = mapped_column('Titelbild', ForeignKey('Titelbild.ID')) + Klappentext: Mapped[Optional[str]] = mapped_column(Text) + Anmerkungen: Mapped[Optional[str]] = mapped_column(Text) + + Genre_: Mapped[List['Genre']] = relationship('Genre', secondary='Werk_Genre', back_populates='Werk') + Herausgeber_: Mapped[List['Herausgeber']] = relationship('Herausgeber', secondary='Werk_Herausgeber', back_populates='Werk') + Reihe1: Mapped[Optional['Reihe']] = relationship('Reihe', back_populates='Werk') + Titelbild1: Mapped[Optional['Titelbild']] = relationship('Titelbild', back_populates='Werk') + Verlag1: Mapped[Optional['Verlag']] = relationship('Verlag', back_populates='Werk') + Werksform1: Mapped[Optional['Werksform']] = relationship('Werksform', back_populates='Werk') + Veroeffentlichung: Mapped[List['Veroeffentlichung']] = relationship('Veroeffentlichung', back_populates='Werk1') + + +t_Text_Genre = Table( + 'Text_Genre', Base.metadata, + Column('Text', ForeignKey('Text.ID'), primary_key=True), + Column('Genre', ForeignKey('Genre.ID'), primary_key=True) +) + + +class Veroeffentlichung(Base): + __tablename__ = 'Veroeffentlichung' + + Text1: Mapped[int] = mapped_column('Text', ForeignKey('Text.ID')) + Werk_: Mapped[int] = mapped_column('Werk', ForeignKey('Werk.ID')) + Pseudonym_: Mapped[int] = mapped_column('Pseudonym', ForeignKey('Pseudonym.ID')) + ID: Mapped[Optional[int]] = mapped_column(Integer, primary_key=True) + AltTitel: Mapped[Optional[str]] = mapped_column(Text) + AltUntertitel: Mapped[Optional[str]] = mapped_column(Text) + + Pseudonym1: Mapped['Pseudonym'] = relationship('Pseudonym', back_populates='Veroeffentlichung') + Text2: Mapped['Text_'] = relationship('Text_', back_populates='Veroeffentlichung') + Werk1: Mapped['Werk'] = relationship('Werk', back_populates='Veroeffentlichung') + + +t_Werk_Genre = Table( + 'Werk_Genre', Base.metadata, + Column('Werk', ForeignKey('Werk.ID'), primary_key=True), + Column('Genre', ForeignKey('Genre.ID'), primary_key=True) +) + + +t_Werk_Herausgeber = Table( + 'Werk_Herausgeber', Base.metadata, + Column('Herausgeber', ForeignKey('Herausgeber.ID'), primary_key=True), + Column('Werk', ForeignKey('Werk.ID'), primary_key=True) +) diff --git a/works.oldschema.sqlite b/works.oldschema.sqlite new file mode 100644 index 0000000..e8a52d4 Binary files /dev/null and b/works.oldschema.sqlite differ