Introduction
SQLAlchemy et Pydantic sont deux outils puissants pour tout développeur Python : l'un pour interagir avec les bases de données, l'autre pour valider les données. Mais il y avait toujours un fossé entre eux. La solution ? SQLModel – un ORM basé sur Pydantic qui combine le meilleur des deux mondes.
Avec SQLModel, vous pouvez utiliser des modèles Pydantic typés comme des tables ORM SQLAlchemy. Cela simplifie le développement, accélère la création d'API et élimine la duplication de code entre vos modèles de base de données et vos sérialiseurs.
Qu'est-ce que SQLModel et pourquoi l'utiliser ?
SQLModel est une bibliothèque ORM moderne pour Python, créée par Sebastián Ramírez (le créateur de FastAPI) en 2021. Elle résout l'un des plus gros problèmes du développement web : la duplication de code entre les modèles de base de données et les schémas de validation.
Les avantages clés de SQLModel
SQLModel offre aux développeurs une interface unifiée pour gérer les bases de données et valider les données. Voici ses principaux atouts :
- Modèle de données unique : un seul modèle pour la base de données et l'API
- Validation automatique : validation intégrée grâce à Pydantic
- Typage fort : support complet des types Python et des IDE
- Compatibilité : fonctionne avec les projets SQLAlchemy existants
- Asynchrone : support natif d'async/await
Installation et configuration
Installation de base
pip install sqlmodel
Installation avec dépendances supplémentaires
Pour PostgreSQL :
pip install sqlmodel[postgresql]
Pour le mode asynchrone :
pip install sqlmodel[async]
Installation complète avec toutes les dépendances :
pip install "sqlmodel[postgresql,async]"
Connexion à la base de données
from sqlmodel import SQLModel, create_engine
# SQLite (pour le développement)
engine = create_engine("sqlite:///database.db")
# PostgreSQL
engine = create_engine("postgresql://user:password@localhost/dbname")
# MySQL
engine = create_engine("mysql+pymysql://user:password@localhost/dbname")
Les bases de SQLModel
Créer un modèle de base
from sqlmodel import SQLModel, Field
from typing import Optional
class User(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
email: str = Field(unique=True)
age: int = Field(ge=0, le=150)
is_active: bool = Field(default=True)
Paramètres de Field
SQLModel utilise le Field enrichi de Pydantic avec des fonctionnalités supplémentaires :
class Product(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(max_length=100, index=True)
price: float = Field(gt=0, description="Prix du produit")
category_id: int = Field(foreign_key="category.id")
created_at: datetime = Field(default_factory=datetime.now)
Créer les tables dans la base de données
from sqlmodel import SQLModel, create_engine
engine = create_engine("sqlite:///database.db")
# Création de toutes les tables
SQLModel.metadata.create_all(engine)
# Création d'une table spécifique
User.metadata.create_all(engine)
Opérations CRUD avec SQLModel
Créer des enregistrements
from sqlmodel import Session
# Création d'un seul enregistrement
user = User(name="Jean", email="jean@example.com", age=25)
with Session(engine) as session:
session.add(user)
session.commit()
session.refresh(user) # Récupérer l'ID depuis la base
print(f"Utilisateur créé avec l'ID : {user.id}")
Aussi dans la bibliothèque
Client Redis pour C# (.NET) : StackExchange.Redis
Parsing HTML en Java : meilleures bibliothèques et exemples de code