SQLModel – Pydantic-basiertes ORM für Python

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung

SQLAlchemy und Pydantic sind zwei mächtige Werkzeuge für Python-Entwickler: eines für die Arbeit mit Datenbanken, das andere für die Datenvalidierung. Doch zwischen ihnen klaffte stets eine Lücke. Die Lösung dieses Problems ist SQLModel – ein Pydantic-basiertes ORM, das die Stärken beider Welten vereint.

SQLModel ermöglicht es, typisierte Pydantic-Modelle direkt als ORM-Tabellen von SQLAlchemy zu verwenden. Das vereinfacht die Entwicklung, beschleunigt die API-Erstellung und eliminiert Code-Duplizierung zwischen Datenbankmodellen und Serialisierern.

Was ist SQLModel und warum wird es benötigt?

SQLModel ist eine moderne ORM-Bibliothek für Python, die 2021 von Sebastián Ramírez (dem Entwickler von FastAPI) ins Leben gerufen wurde. Sie löst eines der Hauptprobleme der Webentwicklung – die doppelte Modellierung von Datenbanktabellen und Validierungsschemata.

Die wichtigsten Vorteile von SQLModel

SQLModel bietet Entwicklern eine einheitliche Schnittstelle für Datenbankzugriff und Datenvalidierung. Zu den Hauptvorteilen gehören:

  • Einheitliches Datenmodell: Ein Modell für Datenbank und API
  • Automatische Validierung: Integrierte Datenvalidierung durch Pydantic
  • Typsicherheit: Volle Unterstützung für Python-Typen und IDEs
  • Kompatibilität: Funktioniert mit bestehenden SQLAlchemy-Projekten
  • Asynchronität: Native Unterstützung für async/await

Installation und Einrichtung

Basisinstallation

pip install sqlmodel

Installation mit zusätzlichen Abhängigkeiten

Für PostgreSQL:

pip install sqlmodel[postgresql]

Für asynchrone Nutzung:

pip install sqlmodel[async]

Vollständige Installation mit allen Abhängigkeiten:

pip install "sqlmodel[postgresql,async]"

Verbindung zur Datenbank

from sqlmodel import SQLModel, create_engine

# SQLite (für Entwicklung)
engine = create_engine("sqlite:///database.db")

# PostgreSQL
engine = create_engine("postgresql://benutzer:passwort@localhost/dbname")

# MySQL
engine = create_engine("mysql+pymysql://benutzer:passwort@localhost/dbname")

Grundlagen der Arbeit mit SQLModel

Erstellen eines Basismodells

from sqlmodel import SQLModel, Field
from typing import Optional

class Benutzer(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str = Field(index=True)
    email: str = Field(unique=True)
    alter: int = Field(ge=0, le=150)
    ist_aktiv: bool = Field(default=True)

Field-Parameter

SQLModel nutzt das erweiterte Field von Pydantic mit zusätzlichen Funktionen:

class Produkt(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str = Field(max_length=100, index=True)
    preis: float = Field(gt=0, description="Preis des Produkts")
    kategorie_id: int = Field(foreign_key="kategorie.id")
    erstellt_am: datetime = Field(default_factory=datetime.now)

Tabellen in der Datenbank erstellen

from sqlmodel import SQLModel, create_engine

engine = create_engine("sqlite:///database.db")

# Alle Tabellen erstellen
SQLModel.metadata.create_all(engine)

# Bestimmte Tabelle erstellen
Benutzer.metadata.create_all(engine)

CRUD-Operationen mit SQLModel

Datensätze erstellen

from sqlmodel import Session

# Einzelnen Datensatz erstellen
benutzer = Benutzer(name="Max", email="max@example.com", alter=30)

with Session(engine) as session:
    session.add(benutzer)
    session.commit()
    session.refresh(benutzer)  # ID aus der Datenbank abrufen
    print(f"Erstellt: {benutzer}")                    

Empfehlungen