Outils pour utilisateurs

Outils du site


Panneau latéral

Plan du Site:

python:flask:flask_sqlalchemy:modeles

Définition de modèles et Relations

Un modèle est une classe Python qui représente les enregistrements d'une table.

app/models/role.py
from app import db
 
class Role(db.Model):
    __tablename__ = 'roles'
    id   = db.Column(db.Integer,    primary_key=True)
    name = db.Column(db.String(64), unique=True)
 
    def __repr__(self):
        return '<Role %r>' % self.name
app/models/user.py
from app import db
 
class User(db.Model):
    __tablename__ = 'users'
    id       = db.Column(db.Integer,     primary_key=True)
    username = db.Column(db.String(64),  unique=True, index=True)
    email    = db.Column(db.String(200), unique=True)
 
    def __repr__(self):
        return '<User %r>' % self.username
 
    def hello(self):
        print("Hello, my name is %s." % self.name)

Pour un champ de type LONGTEXT sous MySQL/MariaDB :

...
from sqlalchemy.dialects.mysql import LONGTEXT
 
...
 
class Article(db.Model):
    ....
    contenu = db.Column(LONGTEXT)
    ...

Clé primaire

Une clé primaire est obligatoire pour chaque table, elle est généralement appelée id.

Types de colonnes

Nom Type Python
Integer int Regular integer, typically 32 bits
SmallIntegerint Short-range integer, typically 16 bits
BigInteger int or long Unlimited precision integer
Float float Floating-point number
Numeric decimal.Decimal Fixed-point number
String str Variable-length string
Text str Variable-length string, optimized for large or unbounded length
Unicode unicode Variable-length Unicode string
UnicodeText unicode Variable-length Unicode string, optimized for large or unbounded length
Boolean bool Boolean value
Date datetime.date Date value
Time datetime.time Time value
DateTime datetime.datetime Date and time value
Interval datetime.timedelta Time interval
Enum str List of string values
PickleType Any Python object Automatic Pickle serialization
LargeBinary str Binary blob

Options des colonnes

primary_key If set to True, the column is the table’s primary key.
unique If set to True, do not allow duplicate values for this column.
index If set to True, create an index for this column, so that queries are more efficient.
nullable If set to True, allow empty values for this column. If set to False, the column will not allow null values.
default Define a default value for the column.

Exemples

import datetime
 
class Exemple(db.Model):
    ...
    # Entiers
    id = db.Column(db.Integer, primary_key=True)
    n  = db.Column(db.Integer)
    ...
    # Décimaux
    f1 = db.Column(db.Float, precision=2)
    f2 = db.Column(db.Numeric, precision=2)
    ...
    # Chaînes
    s  = db.Column(db.String(100))
    t  = db.Column(db.Text)
    ...
    # Date et heures
    d1 = db.Column(db.Date, default=datetime.date.today)
    d2 = db.Column(db.DateTime, default=datetime.datetime.now)
    ...

Relations

One-to-many

One Role ⇔ Many Users :

class Role(db.Model):
    __tablename__ = 'roles'
    id    = db.Column(db.Integer, primary_key=True)
    name  = db.Column(db.String(200))
    # ...
    users = db.relationship('User', backref='role')
 
class User(db.Model):
    __tablename__ = 'users'
    id    = db.Column(db.Integer, primary_key=True)
    name  = db.Column(db.String(200))
    # ...
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
  • Dans le modèle User : roles.id identifie la colonne id de la table roles comme

“clé étrangère” dans la relation.

  • Dans le modèle Role : backref ajoute un attribut role au modèle User.
>>> r = Role(nom='Manager')
>>> u = User(nom='Marc', role=r)
 
>>> u.nom
'Marc'
 
>>> u.role.nom
'Manager'

Many-to-many

Création/mise à jour de la DB

Après avoir créé/modifié les modèles, il faut appliquer les changements dans la base de données (ajout de tables, création de champs, etc.)

Ne rien faire manuellement, mais utiliser les Migrations.

python/flask/flask_sqlalchemy/modeles.txt · Dernière modification: 2023/10/23 15:38 par marclebrun