Utiliser des types de données personnalisés dans SQLAlchemy pour les colonnes
SQLAlchemy permet de créer des types de données personnalisés pour les colonnes d’une table, ce qui peut être utile lorsque vous avez des besoins spécifiques pour stocker ou récupérer des données. Par exemple, vous pouvez définir un type personnalisé pour gérer des données complexes ou pour appliquer des transformations lors de l’insertion ou de la récupération des valeurs.
Fonctions :
-
Définir les types de colonnes
Lors de la création de tables dans une base de données via SQLAlchemy (ORM ou Core), il est nécessaire de définir les colonnes et leurs types de données. On utilise pour cela la classe Column() ainsi que des types tels que Integer, String, Float, Boolean, DateTime, etc. Ces types sont mappés aux types de données des SGBD (SQLite, PostgreSQL, MySQL...). Cela permet de contrôler la structure et les contraintes des tables directement depuis Python.
Importation :
from sqlalchemy import Column, Integer, String, Float, Boolean, DateTime from sqlalchemy.ext.declarative import declarative_baseAttributs :
Paramètre Type Description type_Type SQLA Le type de la colonne (Integer, String, Float, Boolean, DateTime...). primary_keybool Si la colonne est une clé primaire. nullablebool Si la colonne accepte des valeurs NULL ( Truepar défaut).uniquebool Si la colonne impose une contrainte d'unicité. defaultvaleur Valeur par défaut de la colonne. indexbool Si un index doit être créé sur cette colonne. autoincrementbool Si la colonne est auto-incrémentée (utilisé en général avec les clés primaires numériques). Principaux types de données SQLAlchemy :
Type Description IntegerEntier (équivalent à INTEGER en SQL). String(length)Chaîne de caractères (VARCHAR). La longueur doit être précisée. TextTexte long (TEXT). FloatNombre à virgule flottante (FLOAT). BooleanBooléen (TRUE/FALSE). DateTimeDate et heure. DateDate uniquement. TimeHeure uniquement. Exemple de code :
from sqlalchemy import Column, Integer, String, Float, Boolean, DateTime, create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker import datetime # Déclaration de la base Base = declarative_base() # Définition d'une table 'utilisateurs' class Utilisateur(Base): __tablename__ = 'utilisateurs' id = Column(Integer, primary_key=True, autoincrement=True) nom = Column(String(50), nullable=False) email = Column(String(100), unique=True, nullable=False) age = Column(Integer) solde = Column(Float, default=0.0) est_actif = Column(Boolean, default=True) date_creation = Column(DateTime, default=datetime.datetime.utcnow) # Création de la base SQLite engine = create_engine('sqlite:///base_de_donnees.db') # Création des tables Base.metadata.create_all(engine)Explication du code :
- On crée une classe Python représentant la table
utilisateurs. - Chaque attribut est une colonne définie avec
Column()et un type. id: clé primaire, auto-incrémentée.nom: chaîne de 50 caractères, non nullable.email: chaîne de 100 caractères, doit être unique, non nullable.age: entier, optionnel.solde: nombre à virgule flottante, valeur par défaut 0.0.est_actif: booléen, par défautTrue.date_creation: date et heure de création, avec une valeur par défaut dedatetime.datetime.utcnow.
Remarques :
-
String(length)est obligatoire pour certaines bases de données (comme MySQL) si on veut contrôler la longueur maximale. -
Pour PostgreSQL, SQLAlchemy offre des types spécifiques comme
JSON,ARRAY,UUID. -
Pour les colonnes DateTime, si vous utilisez
default=datetime.datetime.utcnow(sans les parenthèses), vous donnez la fonction comme argument, ce qui permet d’appeler l’heure exacte lors de l’insertion. -
Si vous avez besoin d'options avancées comme des contraintes étrangères, des triggers, etc., SQLAlchemy propose également des arguments supplémentaires via
ForeignKey,CheckConstraint, etc.
- On crée une classe Python représentant la table