{{tag>dev python orm flask sqlachemy}}
:TODO_DOCUPDATE:
====== L'extension Flask-SQLAlchemy ======
===== A propos de SQLAlchemy =====
SQLAlchemy est un **ORM** (Object-Relational Mapping) il permet de traduire les objets Python en données pouvant être enregistrées dans un SGBD externe.
===== Installation =====
Pour pouvoir utiliser l'extension, installer le module **Flask-SQLAlchemy**
# Dans votre environnement virtuel
pip install Flask-SQLAlchemy
===== Options de configuration =====
Lors de la phase de développement ou pendant les tests, il peut être utile d'utiliser une base de donnée SQLite en RAM seulement (pour éviter les écritures sur disque).
Pour cela on définit la valeur de la variable de configuration ''SQLALCHEMY_DATABASE_URI'' comme indiqué ci-dessous :
# Pour utiliser une base SQLite en mémoire l'URL doit être vide
app.config["SQLALCHEMY_DATABASE_URI"] = 'sqlite://'
Il peut être également utile d' [[dev:python:flask:extensions:flask-sqlalchemy:afficher-les-requetes|afficher les requêtes produites par l'ORM]].
===== Types de champs usuels =====
* db.Boolean
* db.Integer
* db.Float(precision=2)
* db.String(100)
* db.Text
* db.Date
* db.DateTime
source : [[https://docs.sqlalchemy.org/en/20/orm/declarative_tables.html#mapped-column-derives-the-datatype-and-nullability-from-the-mapped-annotation|Les types de données (docs.sqlalchemy.org) ]]
===== Réordonner les enregistrements =====
Ici on récupères tous les enregistrements en spécifiant l'ordre
===== Utiliser Clause WHERE =====
>>> # Récupère l'enregistrement dont le nom est 'memo'
>>> mc = MarkerCategory.query.where(MarkerCategory.name == 'memo').all()
>>> mc
[]
===== Définition des associations =====
Les différentes associations entre tables sont abordées dans les notes suivantes :
* Définir des associations one-to-many
* Définir des associations many-to-many
===== Traitement des erreurs =====
from sqlalchemy.exc import IntegrityError, OperationalError
...
try:
# Code SQLAlchemy susceptible de lever une exception
db.session.commit()
except (IntegrityError, OperationalError) as e:
# Traitement des exceptions
db.session.rollback()
print(f"An error occurred: {str(e)}")
===== Références =====
* https://flask-sqlalchemy.palletsprojects.com/en/stable/
* https://docs.sqlalchemy.org/en/20/orm/basic_relationships.html#one-to-one
* https://pythonbasics.org/flask-sqlalchemy/
* https://www.slingacademy.com/article/solving-sqlalchemy-integrityerror-when-inserting-data/
* https://www.codementor.io/@garethdwyer/building-a-crud-application-with-flask-and-sqlalchemy-dm3wv7yu2
* https://www.digitalocean.com/community/tutorials/how-to-use-one-to-many-database-relationships-with-flask-sqlalchemy
* https://stackoverflow.com/questions/18807322/sqlalchemy-foreign-key-relationship-attributes
* https://www.youtube.com/watch?v=g0-7TrVCNtg
* [[https://codezup.com/mastering-database-operations-with-sqlalchemy-flask/|Maitriser les opérations sur les bases de données avec Flask-SQLAlchemy (codezup.com)]]
* [[https://dnmtechs.com/catching-sqlalchemy-exceptions-in-python-3-programming/|Traitement des exceptions SQLAlchemy (dnmtechs.com)]]