BaseModels in SQLAlchemy

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

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!
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Antworten