Je suis nouveau dans flask et sqlalchemy, je viens de commencer à travailler sur une application flask, et j'utilise sqlalchemy pour le moment. Je me demandais s'il y avait un avantage significatif à tirer de l'utilisation de flask-sqlalchemy par rapport à sqlalchemy. Je n'ai pas pu trouver assez de motivations dans http://packages.python.org/Flask-SQLAlchemy/index.html ou peut-être que je n'ai pas compris la valeur !! J'apprécierais vos éclaircissements.
93
flask-sqlalchemy
sont sur le bon vieuxsqlalchemy
dans une application Flask?Flask-SqlAlchemy
qu'il ne fournit aucun moyen de configurer la multi-location dans l'application. C'est le plus gros inconvénient de l'OMI.binds
fourni uniquement est d'attacher une base de données différente à un modèle différent, alors qu'il n'y a aucun moyen d'utiliser une base de données spécifique au locataire avec le même modèle.Réponses:
La principale caractéristique de l '
Flask-SQLAlchemy
est une bonne intégration avec l'application Flask - il crée et configure le moteur, la connexion et la session et le configure pour fonctionner avec l'application Flask.Cette configuration est assez complexe car nous devons créer la session étendue et la gérer correctement selon le cycle de vie de demande / réponse de l'application Flask.
Dans le monde idéal, ce serait la seule caractéristique de
Flask-SQLAlchemy
, mais en fait, cela ajoute peu de choses de plus. Voici un bon article de blog avec un aperçu d'eux: Démystifier Flask-SQLAlchemy .Quand j'ai travaillé pour la première fois avec Flask et SQLAlchemy, je n'aimais pas cette surcharge. Je suis allé plus loin et ai extrait le code de gestion de session de l'extension. Cette approche fonctionne, même si j'ai découvert qu'il est assez difficile de faire cette intégration correctement.
Donc, l'approche la plus simple (qui est utilisée dans un autre projet sur lequel je travaille) consiste simplement à déposer le fichier
Flask-SQLAlchemy
et à n'utiliser aucune des fonctionnalités supplémentaires qu'il fournit. Vous aurez ledb.session
et vous pourrez l'utiliser comme s'il s'agissait d'uneSQLAlchemy
configuration pure .la source
This setup is quite complex as we need to create the scoped session and properly handle it according to the Flask application request/response life-cycle.
Voir plus de détails dans la documentation SQLAlchemy: Quand dois-je construire une session, quand dois-je la valider et quand dois-je Ferme le? et Sessions contextuelles / locales de thread .Pour être honnête, je ne vois aucun avantage. IMHO, Flask-SQLAlchemy crée une couche supplémentaire dont vous n'avez pas vraiment besoin. Dans notre cas, nous avons une application Flask assez complexe avec plusieurs bases de données / connexions (maître-esclave) utilisant à la fois ORM et Core où, entre autres choses, nous devons contrôler nos sessions / transactions DB (par exemple, modes dryrun vs commit). Flask-SQLAlchemy ajoute des fonctionnalités supplémentaires telles que la destruction automatique de la session en supposant certaines choses pour vous, ce qui n'est très souvent pas ce dont vous avez besoin.
la source
Flask-SQLAlchemy vous donne un certain nombre de bonus que vous finiriez par implémenter vous-même en utilisant SQLAlchemy.
Aspects positifs de l'utilisation de Flask-SQLAlchemy
apply_driver_hacks
qui définit automatiquement les valeurs par défaut saines sur des thigs comme MySQL pool-sizeDéfinissez automatiquement les noms de table. Flask-SQLAlchemy définit automatiquement les noms de vos tables en convertissant votre
ClassName
>class_name
cela peut être remplacé en définissant l'__tablename__
élément de liste de classeAspects négatifs de l'utilisation de Flask-SQLAlchemy
la source
La documentation de SQLAlchemy indique clairement que vous devez utiliser Flask-SQLAlchemy (surtout si vous ne comprenez pas ses avantages!):
Cette citation et une motivation détaillée vous pouvez trouver dans la deuxième question de la FAQ Session .
la source
comme @schlamar le suggère, Flask-SqlAlchemy est sans aucun doute une bonne chose. J'aimerais simplement ajouter un contexte supplémentaire au point qui y est fait.
Ne vous sentez pas comme si vous choisissez l'un sur l'autre. Par exemple, disons que nous voulons récupérer tous les enregistrements d'une table en utilisant un modèle utilisant Flask-Sqlalchemy. C'est aussi simple que
Pour beaucoup de cas simples, Flask-Sqlalchemy va tout à fait bien. Le point supplémentaire que je voudrais faire est que si Flask-Sqlalchemy ne fait pas ce que vous voulez, il n'y a aucune raison pour laquelle vous ne pouvez pas utiliser SqlAlchemy directement.
Comme vous pouvez le voir, nous pouvons facilement passer de l'un à l'autre sans problème et dans le deuxième exemple, nous utilisons en fait les modèles définis par Flask-Sqlalchemy.
la source
Model.query.all()
" - tout cela peut être fait avec juste SQLAlchemy, en utilisant Flask-SQLAlchemy ne fournit absolument rien de nouveau ici.Model.query.all()
àdb.session.query(Model).all()
pour une raison quelconque a permis aux sessions de suivre et d'être mis à jour normalement.Voici un exemple d'un avantage que flask-sqlalchemy vous offre par rapport à sqlalchemy ordinaire.
Supposons que vous utilisez flask_user.
flask_user automatise la création et l'authentification des objets utilisateur, il doit donc accéder à votre base de données. La classe UserManager fait cela en appelant à quelque chose appelé "adaptateur" qui fait abstraction des appels de base de données. Vous fournissez un adaptateur dans le constructeur UserManager et l'adaptateur doit implémenter ces fonctions:
Si vous utilisez flask-sqlalchemy, vous pouvez utiliser le SQLAlchemyAdapter intégré. Si vous utilisez sqlalchemy (pas-flask-sqlalchemy), vous pouvez faire des hypothèses différentes sur la manière dont les objets sont enregistrés dans la base de données (comme les noms des tables), vous devrez donc écrire votre propre classe d'adaptateur.
la source