Seite 1 von 1

BaseModels in SQLAlchemy

Verfasst: Mittwoch 6. Juli 2022, 10:12
von JakobPrie
Hi,
ich verwende FastAPI und möchte eine SQLAlchemy daran anbinden. Als DB verwende ich noch SQLite, möchte aber wahrscheinlich später zu PostgreSQL oder MySQL switchen.
Laut dem FastAPI Tutorial (https://fastapi.tiangolo.com/advanced/a ... databases/) muss man Tabellen erstellen (sqlalchemy.Table()), aber auch Base models.

Warum muss ich beides erstellen? Kann nicht aus einem Schema die Tabelle abgeleitet werden? Fände ich auch schöner, da Änderungen in dem Schema auch für die Tabelle übernommen werden kann.

Ein beispielhaftes Schema von mir:

Code: Alles auswählen

Base = declarative_base()


class AlarmSchema(Base):
    __tablename__ = "alarms"

    id = Column(Integer, primary_key=True)
    text = Column(String)
    alarm_time = Column(Time)
    repeating = relationship("AlarmRepeatingSchema", uselist=False, backref="alarms")
    song_name = Column(String)
    active = Column(Boolean)
    initiated = Column(Boolean)
    user_id = Column(Integer, ForeignKey(UserSchema.id))
    last_executed = Column(DateTime)


Danke!

Re: BaseModels in SQLAlchemy

Verfasst: Mittwoch 6. Juli 2022, 15:40
von noisefloor
Hallo,

ich bin nicht sicher, ob ich deine Frage 100% richtige verstehe, aber
Warum muss ich beides erstellen? Kann nicht aus einem Schema die Tabelle abgeleitet werden?
Das Schema muss ja nicht gleich der Tabelle sein. In dem Tutorial hast du ja z.B. zwei Schemata, `NoteIn` und `Note`. `NoteIn` hat nicht alle Spalten der Tabelle in der DB - kann ja auch nicht, weil die ID zu dem Zeitpunkt nicht bekannt ist.

Beim Arbeiten mit Pydantic und SQLAlchemy ist es nun mal so, dass du einmal den "Aufwand" der Deklaration der Modelle und Datenbanken hast, weil das nun mal die Grundlagen für alles ist, was du später mit den Daten anstellst.

Gruß, noisefloor

Re: BaseModels in SQLAlchemy

Verfasst: Mittwoch 6. Juli 2022, 18:01
von Sirius3
Ich habe mich jetzt nicht sehr intensiv mit Pydantic beschäftigt, aber es scheint mir ein sehr umständliches Design zu sein, alles dreimal zu definieren, einmal als SQLAlchemy-Model, einmal als Model zum Erzeugen neuer Elemente und einmal als Model zum Abfragen von bestehenden Elementen.
Eigentlich kann man alles vom SQLAlchemy-Model ableiten, das kennt die Typen und auch welche Felder für neue Daten erforderlich sind.
Naja, da scheine ich nicht der einzige zu sein:
https://github.com/tiangolo/fastapi/issues/214
https://github.com/tiangolo/pydantic-sqlalchemy

Re: BaseModels in SQLAlchemy

Verfasst: Freitag 8. Juli 2022, 15:13
von DasIch
Das ist nicht alles das gleiche. Auf der einen Seite hast du etwas dass ein Struktur um HTTP Resourcen zu repräsentieren und validieren und auf der anderen Seite hast du eine Struktur um Zeilen in Tabellen in deiner Datenbank zu repräsentieren.

Es kann sein dass die bei einfachen CRUD Anwendungen sich sehr ähnlich, vielleicht sogar identisch, aussehen aber das ist nicht zwangsläufig so. Es gibt Methoden die vermeintliche Wiederholung die bei sowas entsteht zu vermeiden aber meiner Erfahrung nach kommt man es früher oder später an den Punkt an dem die Unterschiede relevant werden.