Un modèle est une classe Python qui représente les enregistrements d'une table.
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
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) ...
Une clé primaire est obligatoire pour chaque table, elle est généralement appelée id.
Nom | Type Python | |
---|---|---|
Integer | int | Regular integer, typically 32 bits |
SmallInteger | int | 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 |
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. |
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) ...
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'))
roles.id
identifie la colonne id
de la table roles
comme“clé étrangère” dans la relation.
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'
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.