flask-sqlalchemy ou sqlalchemy

93

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.

Amin
la source
6
Hmm, il n'y a toujours pas de réponse satisfaisante ici. Quelqu'un peut -il expliquer ce que les avantages concrets réels de flask-sqlalchemysont sur le bon vieux sqlalchemydans une application Flask?
Steve Bennett
Cependant, un gros inconvénient est Flask-SqlAlchemyqu'il ne fournit aucun moyen de configurer la multi-location dans l'application. C'est le plus gros inconvénient de l'OMI. bindsfourni 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.
Rohit Jain

Réponses:

68

La principale caractéristique de l ' Flask-SQLAlchemyest 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-SQLAlchemyet à n'utiliser aucune des fonctionnalités supplémentaires qu'il fournit. Vous aurez le db.sessionet vous pourrez l'utiliser comme s'il s'agissait d'une SQLAlchemyconfiguration pure .

Boris Serebrov
la source
4
Je reste confus. Le billet de blog lié (et la documentation officielle!) Liste certaines fonctionnalités simples de SQLAlchemy (comme la base déclarative) comme s'il s'agissait de fonctionnalités Flask-SQLAlchemy; on ne sait pas s'ils s'attribuent le mérite des éléments intégrés à SQLAlchemy ou s'ils les ont réimplémentés (ni pourquoi ils l'ont fait, si c'est ce dernier). Votre premier paragraphe répertorie deux fonctionnalités: des wrappers pratiques pour la gestion de session (mais n'aurez-vous pas besoin de créer les vôtres de toute façon si vous souhaitez utiliser vos modèles SQLAlchemy en dehors de Flask?) Et une "configuration" non spécifiée pour "travailler avec l'application Flask" . Qu'est-ce que cela veut dire ?
Mark Amery
1
Je suis également un peu confus par les questions. Le billet de blog lié est assez clair IMO, par exemple, il dit "Modèle de base déclaratif personnalisé avec prise en charge de la propriété de requête et de la pagination", la clé est "personnalisée" et "avec prise en charge de la propriété de requête et de la pagination" est ce qu'il ajoute en plus de Base déclarative de SQLAlchemy.
Boris Serebrov
1
En ce qui concerne les "emballages de commodité" - ils ne sont pas pour la commodité, mais pour que les choses fonctionnent correctement. Pour commencer à utiliser SQLAlchemy, vous avez besoin des objets de connexion à la base de données (eninge / connection / session) et vous ne souhaitez pas les créer chaque fois que vous devez effectuer une requête SQL, ils doivent donc être créés globalement et disponibles dans le code de l'application. Vous pouvez donc faire quelque chose comme "from yourapplication import db" puis faire "db.session.something ()" sans penser comment créer et initialiser correctement cet objet "db".
Boris Serebrov
Et en ce qui concerne la "configuration" non spécifiée pour "travailler avec l'application Flask" - elle est en fait spécifiée dans le deuxième paragraphe: 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 .
Boris Serebrov
20

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.

MOCKBA
la source
5
Oui, dans votre cas d'utilisation, Flask-SQLAlchemy semble obsolète. Mais si l'OP avait un tel scénario, il ne posera probablement pas cette question. Pour un nouvel utilisateur qui ne sait rien de la portée de la session, Flask-SQLAlchemy est définitivement un must!
schlamar
20

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


  1. Flask_SQLAlchemy gère la configuration, l'installation et le démontage de session pour vous.
  2. Vous offre un modèle de base déclaratif qui facilite les requêtes et la pagination
  3. Paramètres spécifiques au backend: Flask-SQLAlchemy analyse les bibliothèques installées pour la prise en charge d'Unicode et, en cas d'échec, utilise automatiquement SQLAlchemy Unicode.
  4. A une méthode appelée apply_driver_hacksqui définit automatiquement les valeurs par défaut saines sur des thigs comme MySQL pool-size
  5. Possède de jolies méthodes intégrées create_all () et drop_all () pour créer et supprimer toutes les tables. Utile pour les tests et en ligne de commande python si vous avez fait quelque chose de stupide
  6. Il vous donne get_or_404 () au lieu de get () et find_or_404 () au lieu de find () Exemple de code à> http://flask-sqlalchemy.pocoo.org/2.1/queries/

Définissez automatiquement les noms de table. Flask-SQLAlchemy définit automatiquement les noms de vos tables en convertissant votre ClassName> class_namecela peut être remplacé en définissant l' __tablename__élément de liste de classe

Aspects négatifs de l'utilisation de Flask-SQLAlchemy


  1. L'utilisation de Flask-SQLAlchemy ajoutera des difficultés supplémentaires à la migration de Flask, disons Pyramid, si vous en avez besoin. Cela est principalement dû au modèle de base déclaratif personnalisé sur Flask_SQLAchemy.
  2. En utilisant Flask-SQLAlchemy, vous risquez d'utiliser un package avec une communauté beaucoup plus petite que SQLAlchemy lui-même, que je ne peux pas facilement abandonner du développement actif de si tôt.
  3. Certains extras intéressants de Flask-SQLAlchemy peuvent vous rendre confus si vous ne savez pas qu'ils sont là.
Kimmo Hintikka
la source
15

La documentation de SQLAlchemy indique clairement que vous devez utiliser Flask-SQLAlchemy (surtout si vous ne comprenez pas ses avantages!):

[...] des produits tels que Flask-SQLAlchemy [...] SQLAlchemy recommande fortement que ces produits soient utilisés tels que disponibles.

Cette citation et une motivation détaillée vous pouvez trouver dans la deuxième question de la FAQ Session .

schlamar
la source
2
Flask-sqlalchemy semble être non maintenu. La dernière mise à jour date du 1er août 2013. Ce conseil est-il plus pertinent?
pmav99
@ pmav99 tant que vous n'avez pas de problèmes concrets avec cela, je le recommanderais quand même, en particulier pour les nouveaux utilisateurs.
schlamar
1
Semble être activement maintenu à partir de novembre 2014. Beaucoup d'engagements récents. github.com/mitsuhiko/flask-sqlalchemy/commits/master
Steve Bennett
25
Même si OP ne l'a pas demandé directement, imo. il voulait connaître les avantages de Flask-SQLAlchemy. Votre réponse est littéralement «utilisez-le même si vous ne savez pas quels sont les avantages» - oui, quels sont les avantages?
Markus Meskanen
1
Cette réponse ne répond pas à la question du PO. Vous recommandez flask-sqlalchemy, sans fournir beaucoup de raisonnement derrière la recommandation.
mbadawi23
7

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

Model.query.all()

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.

from myapp.database import db

num_foo = db.session.query(func.count(OtherModel.id)).filter(is_deleted=False).as_scalar()

db.session.query(Model.id, num_foo.label('num_foo')).order_by('num_foo').all()

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.

Mike Waites
la source
1
"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 Model.query.all()" - tout cela peut être fait avec juste SQLAlchemy, en utilisant Flask-SQLAlchemy ne fournit absolument rien de nouveau ici.
Markus Meskanen
Tu es incroyable! Je suis tombé sur ce post et il a résolu un problème que j'avais. après avoir installé anaconda, pour une raison quelconque, les mises à jour normales ne fonctionnaient pas. changé de Model.query.all()à db.session.query(Model).all()pour une raison quelconque a permis aux sessions de suivre et d'être mis à jour normalement.
Jeff Bluemel
2

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:

class MyAdapter(DBAdapter):
    def get_object(self, ObjectClass, id):
        """ Retrieve one object specified by the primary key 'pk' """
        pass

    def find_all_objects(self, ObjectClass, **kwargs):
         """ Retrieve all objects matching the case sensitive filters in 'kwargs'. """
        pass


    def find_first_object(self, ObjectClass, **kwargs):
        """ Retrieve the first object matching the case sensitive filters in 'kwargs'. """
        pass

    def ifind_first_object(self, ObjectClass, **kwargs):
        """ Retrieve the first object matching the case insensitive filters in 'kwargs'. """
        pass

    def add_object(self, ObjectClass, **kwargs):
        """ Add an object of class 'ObjectClass' with fields and values specified in '**kwargs'. """
        pass

    def update_object(self, object, **kwargs):
        """ Update object 'object' with the fields and values specified in '**kwargs'. """
        pass

    def delete_object(self, object):
        """ Delete object 'object'. """
        pass

    def commit(self):
        pass

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.

Complexe 2
la source