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}")