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_base
Attributs :
Paramètre Type Description type_
Type SQLA Le type de la colonne (Integer, String, Float, Boolean, DateTime...). primary_key
bool Si la colonne est une clé primaire. nullable
bool Si la colonne accepte des valeurs NULL ( True
par défaut).unique
bool Si la colonne impose une contrainte d'unicité. default
valeur Valeur par défaut de la colonne. index
bool Si un index doit être créé sur cette colonne. autoincrement
bool 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 Integer
Entier (équivalent à INTEGER en SQL). String(length)
Chaîne de caractères (VARCHAR). La longueur doit être précisée. Text
Texte long (TEXT). Float
Nombre à virgule flottante (FLOAT). Boolean
Booléen (TRUE/FALSE). DateTime
Date et heure. Date
Date uniquement. Time
Heure 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