flask database handling how use flask with database
Dans ce didacticiel sur la base de données Flask, apprenez à utiliser Flask avec diverses bases de données, telles que Flask MySQL, Flask MongoDB, SQLite, etc.
Nous allons étendre les concepts abordés dans notre premier tutoriel Flask Python. Nous commençons par utiliser Flask avec MongoDB, une base de données NoSQL basée sur des documents, où NoSQL signifie Not Only SQL.
Tout d'abord, nous abordons le concept de connexion à la base de données, puis nous vous expliquons comment ne pas être verrouillé avec une base de données. Si nécessaire, nous pouvons modifier uniquement les configurations pour changer le backend de la base de données.
=> Consultez le guide de formation Perfect Flask ici
Ce que vous apprendrez:
Didacticiel sur la base de données Flask
Dans ce didacticiel, les lecteurs peuvent établir une comparaison entre les bases de données discutées. De plus, nous parlons de Flask-MongoEngine, Flask-SQLAlchemy et Flask MongoAlchemy. Ces deux ORM, à savoir Object Relation Mapper, sont très populaires.
Les ORM sous le capot traduisent de manière transparente les objets (modèles de base de données) en commandes de base de données ou en instructions SQL.
Les avantages de l'utilisation d'un ORM sont énumérés ci-dessous:
- Les développeurs peuvent travailler avec des objets au lieu de tables et SQL.
- Utilisez les migrations pour garder une trace des mises à jour de la base de données.
- Cela réduit les coûts et le temps de développement.
- Il surmonte les différences SQL spécifiques à la base de données.
Lors de l'utilisation d'ORM, les programmeurs n'ont pas besoin d'écrire des requêtes et des commandes SQL complexes pour exécuter des commandes SQL de base.
Connectez-vous à la base de données
Ouvrez le fichier de configuration et notez les valeurs mentionnées ci-dessous. Flask-Appbuilder prend les détails de la base de données sur la chaîne de connexion à partir des valeurs mentionnées.
# The MongoEngine connection string. MONGODB_SETTINGS = { 'DB': 'mydb', 'connect': False, }
Toutes les fonctionnalités de bas niveau de la gestion de base de données par l'ORM ont été encapsulées sous les commandes Flask Click, que nous pouvons voir en utilisant flask fab –help sur la ligne de commande.
Flacon MongoDB
Dans cette section, nous allons apprendre à utiliser les ORM plutôt que d'utiliser des scripts SQL bruts pour travailler avec des bases de données dans Flask.
MongoDB est une base de données documentaire non relationnelle. Nous l'avons déjà configuré avec notre application d'exemple de didacticiel flask actuelle.
Utilisez les commandes ci-dessous pour gérer le serveur MongoDB sur la machine locale.
sudo systemctl start mongod # to start MongoDB sudo systemctl stop mongod # to stop MongoDB sudo systemctl status mongod # to check status MongoDB
Nous avons discuté de deux ORM célèbres que vous pouvez utiliser avec MongoDB et Flask.
À l'aide d'un concepteur de base de données, nous avons créé deux tables appelées Album et Song et défini une relation un-à-plusieurs entre Album et Song. Ci-dessous est l'image représentant la même chose.

Flacon MongoEngine
Créons maintenant notre premier modèle de base de données MongoEngine.
Créez ou modifiez le fichier models.py sous le répertoire de l'application et ajoutez le code suivant.
from mongoengine import Document from mongoengine import DateTimeField, StringField, ReferenceField, ListField, IntField class Album(Document): name = StringField(unique=True, required=True, max_lenth=100) def __str__(self): return self.name class Song(Document): title = StringField(max_lenth=200, required=True, unique=True) rating = IntField(default=0,max_lenth=1) # 1 to 9 album = ReferenceField(Album) def __str__(self): return self.title
Nous avons créé deux modèles MongoEngine appelés Album et Song. Ces modèles correspondent aux documents respectifs de MongoDB.
L'album a un champ de type chaîne avec quelques contraintes.
- Le nom de l'album est unique.
- Le nom de l'album ne peut pas être vide.
- Le nom de l'album peut comporter au maximum cent caractères.
De même, le document Song a un titre, un champ de classement et un champ de référence qui pointe vers un autre document, Album. Sauvegardons ce fichier et créons des données à l’aide de ces deux modèles. Accédez au répertoire racine du projet et utilisez la commande flask shell pour accéder à l'application flask dans le shell Python.
Une fois que vous entrez dans le shell, utilisez les instructions ci-dessous pour accéder aux modèles MongoEngine et créer des exemples de données comme indiqué ci-dessous.
>>> from app.models import Album, Song >>> album1 = Album(name='Album1') >>> album1.save() >>> song1 = Song(title='Song1', rating=9, album=album1) >>> song1.save()
Maintenant, accédons à la base de données en utilisant le client Mongo et voyons si les données sont enregistrées à la suite des instructions données ci-dessus. Dans le code ci-dessus, nous importons d'abord l'album et la chanson, puis créons leurs objets avec les valeurs requises des paramètres.
Ici, les paramètres sont les noms de champs tels que définis dans les modèles, et nous mentionnons nos données en tant que valeurs de ces paramètres. Une fois la création d'objet réussie, nous appelons la méthode save sur les objets respectifs pour enregistrer les documents dans la base de données.
Utilisez la commande mongo pour accéder à MongoDB. Une fois que vous vous êtes connecté au serveur à l'aide du client mongo, utilisez les commandes ci-dessous.
# 1) Consultez la liste des bases de données
> show dbs #----- output ---- admin 0.000GB config 0.000GB local 0.000GB mydb 0.001GB #----- output ----
# 2) Utilisez notre base de données appelée mydb
> use mydb #----- output ---- switched to db mydb #----- output ----
# 3) Vérifiez les collections a.k.a tables dans SGBDR
> show collections #----- output ---- album permission permission_view role song user view_menu #----- output ----
# 4) Listez n'importe quel document dans la collection d'albums.
> db.album.findOne() #----- output ---- { '_id' : ObjectId('5eddb43b8b1e179bef87d41d'), 'name' : 'Album1' } #----- output ----
# 5) Listez n'importe quel document dans la collection de chansons.
> db.song.findOne() #----- output ---- { '_id' : ObjectId('5eddb74b0177c8f096d880ec'), 'title' : 'Song1', 'rating' : 9, 'album' : ObjectId('5eddb43b8b1e179bef87d41d') } #----- output ----
Si vous avez travaillé avec Django, vous vous rendrez compte que MongoEngine fonctionne de manière très similaire à l'ORM intégré de Django. Dans la dernière sortie, lorsque nous avons interrogé une chanson, notez comment la référence d'un autre document est pour le champ album.
Créons maintenant un autre album et effectuons une mise à jour du document de chanson existant.
>>> from app.models import Album, Song >>> album2 = Album(name='Album2') >>> album2.save() >>> songs_q = Song.objects(title='Song1') # query the database >>> songs_q.count() 1 >>> song1 = songs_q(0) >>> song1.album = album2 # update the album field >>> song1.save()
Nous importons les deux modèles, c'est-à-dire Album et Song. Créez ensuite un nouveau document appelé album2. Recherchez la collection de chansons dans la base de données et obtenez la chanson en utilisant son titre. Ensuite, nous accédons à l'objet à l'aide d'un index de tableau du résultat de la requête, mettons à jour à l'aide d'un opérateur d'affectation et enregistrons le document mis à jour.
Utilisons à nouveau le client Mongo pour vérifier les collections stockées.
> db.album.find().pretty() ## output { '_id' : ObjectId('5eddb43b8b1e179bef87d41d'), 'name' : 'Album1' } { '_id' : ObjectId('5eddbaab9fd7d3ec78b2fd8f'), 'name' : 'Album2' } > db.song.find().pretty() ## output { '_id' : ObjectId('5eddb74b0177c8f096d880ec'), 'title' : 'Song1', 'rating' : 9, 'album' : ObjectId('5eddbaab9fd7d3ec78b2fd8f') }
Dans la sortie de la deuxième requête dans l'extrait de code ci-dessus, notez le champ d'album mis à jour du document Song1.
Supprimons maintenant les documents de l'album et de la collection de chansons. Utilisez le code ci-dessous pour supprimer les enregistrements. Si vous êtes toujours dans le shell du flacon, utilisez les commandes mentionnées ci-dessous pour supprimer un document et vérifier la suppression.
>>> song1.delete() >>> songs_q = Song.objects(title='Song1') >>> songs_q.count() 0 >>>
Nous utilisons la méthode de suppression sur song1 pour supprimer le document de la collection de chansons. Nous pourrions effectuer toutes les opérations CRUD de base en utilisant un shell flask. De plus, nous pouvons utiliser la classe ModelView de flask_appbuilder pour afficher les modèles de base de données sous forme de vues.
Créez des vues basées sur un modèle, comme indiqué dans le code ci-dessous.
from app.models import Album, Song from flask_appbuilder import ModelView from flask_appbuilder.models.mongoengine.interface import MongoEngineInterface class SongsView(ModelView): datamodel = MongoEngineInterface(Song) class AlbumView(ModelView): datamodel = MongoEngineInterface(Album)
Nous importons d'abord les modèles de base de données, avec ModelView et MongoEngineInterface. Ensuite, nous sous-classons le ModelView et affectons des instances MongoEngineInterface particulières à l'attribut de modèle de données de nos vues.
Maintenant, enregistrons SongsView et AlbumView avec le menu comme indiqué ci-dessous dans la même catégorie.
appbuilder.add_view(AlbumView, 'Album View', category='Model Views') appbuilder.add_view(SongsView, 'Song View', category='Model Views')
Pour accéder à ces vues sur l'application, accédez à http: // localhost: 8080 /, connectez-vous à l'application à l'aide des informations d'identification d'administrateur et suivez les étapes ci-dessous pour comprendre les vues basées sur le modèle de base de données par défaut.
Étape 1: Cliquez sur le menu Vue du modèle

Étape 2: Cliquez sur le sous-menu Album View.

Étape 3: Cliquez sur l'icône plus pour créer un document ou un enregistrement.

Étape 4: Saisissez le nom de l'album et enregistrez-le.
comment ouvrir les fichiers torrent mac
Comme pour les étapes ci-dessus, vous pouvez effectuer toutes les opérations CRUD à l'aide de ces vues. Par conséquent, créons une chanson en utilisant le sous-menu Song View comme indiqué dans l'image ci-dessous. Remarquez comment un champ de référence d'un modèle de base de données associé est affiché dans la liste déroulante. Essayez de créer d'autres albums et chansons.

Vous pouvez explorer davantage les mêmes concepts en utilisant MongoAlchemy; Un autre ORM facile à utiliser et similaire conçu pour un accès et une manipulation faciles à la base de données MongoDB à l'aide de Python.
Veuillez consulter la documentation de MongoAlchemy ici . Cependant, nous vous recommandons de développer une compréhension de base de Flask-SQLAlchemy en parcourant d'abord la section ci-dessous.
Flask Sqlite ou Flask MySQL
Dans cette section, nous réutilisons la même application pour SQLAlchemy que le moteur backend. Par conséquent, veuillez valider toutes vos modifications jusqu'à présent et créer un tutoriel de branche Git séparé-3-sqla. Flask peut utiliser SQLite et MySQL comme base de données principale. Nous vous recommandons d'utiliser SQLAlchemy comme ORM avec ces bases de données relationnelles.
Commençons par les changements que nous devons apporter après avoir vérifié une nouvelle branche.
Config
Ouvrez config.py dans le répertoire racine du projet et supprimez la chaîne de connexion de MongoDB. Mettez à jour le config.py avec la chaîne de connexion pour Flask SQLite ou Flask MySQL.
# The SQLAlchemy connection string. SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db') # SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
Application __init__.py
Ouvrez maintenant le fichier app / __ init__.py et les importations distantes liées à MongoEngine, et importez SQLA comme indiqué ci-dessous.
#from flask_appbuilder.security.mongoengine.manager import SecurityManager from flask_appbuilder import AppBuilder, SQLA #from flask_mongoengine import MongoEngine # other lines of code #db = MongoEngine(app) db = SQLA(app) #appbuilder = AppBuilder(app, security_manager_class=SecurityManager) appbuilder = AppBuilder(app, db.session)
Modèles de flacons
Mettez à jour models.py avec le code suivant et supprimez le code lié à MongoEngine.
from flask_appbuilder import Model from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship
Vues du flacon
Mettez à jour views.py avec le code suivant.
from flask_appbuilder import ModelView from app.models import Album, Song class AlbumView(ModelView): datamodel = SQLAInterface(Album) class SongsView(ModelView): datamodel = SQLAInterface(Song) appbuilder.add_view(AlbumView, 'Album View', category='Model Views') appbuilder.add_view(SongsView, 'Song View', category='Model Views')
Notez que nous avons utilisé la même classe ModelView mais modifié MongoEngineInterface avec SQLAInterface.
Pour créer les tables et leurs relations correspondantes, nous exécutons la commande mentionnée ci-dessous pour créer des objets de base de données.
flask fab create-db
N'oubliez pas que nous avons changé le backend de la base de données. Par conséquent, utilisez la commande flask fab create-admin pour créer l'utilisateur admin. Démarrez maintenant le serveur de développement comme précédemment; en utilisant python run.py. Accédez à http: // localhost: 8080.
Ici, à ce stade, notre application fonctionnera comme elle a fonctionné dans le cas de MongoDB. Testez-le avec toutes les opérations CRUD, comme nous l'avons fait dans les sections précédentes.
De plus, nous avons montré les deux tables correspondantes pour les modèles de base de données tout en utilisant SQLite DB Browser.


Flacon MySQL
Pour utiliser MySQL comme backend de base de données, lorsque nous utilisons Flask-SQLAlchemy, il suffit de mettre à jour une configuration concernant la base de données dans le config.py.
SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
Selon la chaîne de connexion donnée, le nom de la base de données est myapp. L'utilisateur pour se connecter à la base de données est myapp @ localhost. Cependant, ces deux éléments sont des prérequis et nous devons créer en utilisant les détails ci-dessous.
Par conséquent, utilisez les requêtes ci-dessous pour créer un utilisateur et une base de données afin de faire fonctionner la base de données Flask MySQL l'une avec l'autre. Exécutez ces requêtes dans le client MySQL.
CREATE USER 'myapp'@'localhost' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'myapp'@'localhost'; FLUSH PRIVILEGES; CREATE DATABASE myapp;
Nous devons également installer Python3 mysqlclient. Installez les en-têtes de développement et les bibliothèques comme indiqué dans les commandes ci-dessous.
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pip install mysqlclient
Maintenant que nous avons changé le backend de la base de données, nous devons créer des tables correspondant aux modèles de base de données. Nous devons également créer un utilisateur administrateur Flask car tous les éléments de menu enregistrés sont protégés et ne sont accessibles que par un utilisateur existant dans l'application.
Les commandes ci-dessous masquent les instructions SQL de niveau inférieur pour la suppression et la création des tables.
flask fab create-db flask fab create-admin
Une fois toutes les étapes ci-dessus terminées avec succès, nous pouvons à nouveau accéder à http: // localhost: 8080. Accédez maintenant à l'application comme nous l'avons obtenu dans le cas de Flask SQLite.
Flask Migrate
Au début du développement d'une application, de nombreuses modifications ont été apportées au schéma d'une base de données. Les développeurs qui ajoutent une surcharge au temps de développement doivent effectuer ces changements fréquemment. Dans de tels scénarios similaires, le plugin Flask-Migrate est très utile.
Installons Flask-Migrate.
pip install flask-migrate
En cas d'installation réussie, une sous-commande db est ajoutée. Vérifiez les utilitaires de ligne de commande qui sont ajoutés à cette sous-commande db en utilisant le code mentionné ci-dessous.
flask db --help
Tout d'abord, nous devons créer un objet de migration, comme indiqué ci-dessous dans app / __ init__.py.
from flask import Flask from flask_migrate import Migrate app = Flask(__name__) migrate = Migrate(app, db)
Essayons quelques commandes avec la base de données que nous avons dans notre application.
Initialisez un référentiel de migration distinct.
flask db init
Semblable aux commandes ci-dessus, il existe des commandes pour créer des migrations et les appliquer à l'aide de la commande upgrade. Nous utiliserons ces commandes de migration dans le cadre du flux de travail dans nos didacticiels suivants chaque fois que nécessaire.
Questions fréquemment posées
Vous pourriez rencontrer certaines des questions liées à l'utilisation des bases de données avec Flask.
Q # 1) Quelle base de données Flask utilise-t-elle?
Répondre: Flask prend en charge toutes les bases de données prises en charge par SQLAlchemy, qui est une boîte à outils de base de données pour Python, et est un ORM (Object Relation Mapper). Nous pouvons installer Flask-SQLAlchemy de PyPI pour travailler avec SQLAlchemy.
Flask-Alchemy est un plugin Flask et nécessite une configuration minimale autre que son installation. Certaines des bases de données les plus répandues que les développeurs utilisent avec Flask-SQLAlchemy sont SQLite, PostgreSQL, MySQL, etc.
Flask dispose également de plugins tels que Flask-MongoEngine, Flask-MongoAlchemy, Flask-CouchDB, etc. pour fonctionner avec des bases de données basées sur des documents NoSQL telles que MongoDB et CouchDB.
Q # 2) Comment créer une base de données dans Flask?
Répondre: La création d'une base de données dans Flask dépend généralement du modèle suivi par le plugin Flask correspondant. Presque tous les plugins créent des bases de données en fonction des paramètres de connexion à la base de données définis dans la configuration Flask du projet.
Cependant, vous pouvez écrire votre propre méthode pour créer une base de données dans Flask lorsque vous n'utilisez pas de plugin.
Nous avons donné un exemple trivial de création d'un exemple SQLite ci-dessous. Cet exemple utilise g Object pour conserver la référence de la connexion à la base de données.
import sqlite3 from flask import g # g and current_app object current_app.config('DATABASE') = 'MYDB' # Name of the database def get_db(): '''A method to get the database connection''' if 'db' not in g: g.db = sqlite3.connect( current_app.config('DATABASE'), detect_types=sqlite3.PARSE_DECLTYPES ) g.db.row_factory = sqlite3.Row return g.db def close_db(e=None): '''A method to close the database connection''' db = g.pop('db', None) if db is not None: db.close()
Q # 3) Comment affichez-vous les données d'une base de données dans Flask?
Répondre: Dans Flask, les développeurs utilisent divers mappeurs relationnels d'objets, également appelés ORM. Ces ORM ont généralement des API pour accéder à la base de données en utilisant l'attribut de requête pour lire les données à partir d'un modèle de base de données défini. Les résultats des requêtes stockées dans les structures de données de Python s’affichent à l’aide des modèles Flask.
Cependant, lors du test des modèles de base de données, les résultats peuvent également être imprimés sur la console dans Flask Shell.
Un tel exemple d'interrogation des données à l'aide de l'API de requêtes dans Flask-SQLAlchemy est donné ci-dessous.
>>> user1 = User.query.filter_by(username='testuser').first() >>> user1.id 2 >>> user1.email u'user1@example.org'
Conclusion
Dans ce didacticiel, nous avons abordé les concepts liés à la connexion à différentes bases de données à l'aide de la même présentation de projet. Nous nous sommes éloignés du paradigme de l'écriture de requêtes SQL brutes à l'intérieur du code.
Une approche de l'écriture de tableaux sous forme de modèles nous rend plus agiles. Nous avons également couvert les concepts de stockage des informations de base de données sous forme de migrations. Les migrations ajoutent encore plus de flexibilité à notre flux de travail de développement.
Jusqu'à présent, nous avons travaillé sur un archétype qui est automatiquement généré par le générateur d'applications Flask. Dans nos prochains didacticiels de cette série, nous franchissons une étape de plus et discutons des autres passe-partout Flask et des concepts d'utilisation des plans Flask.
=> Consultez TOUS les didacticiels Flask ici
lecture recommandée
- Tutoriel Python Flask - Introduction à Flask pour les débutants
- Tutoriel API Flask avec exemple | Extension de Flask avec des API
- Mise en page de l'application Flask et du projet Flask avec Blueprint et Bootstrap
- Top 31 des questions d'entrevue Python Flask populaires avec réponses
- Top 10 des outils de conception de base de données pour créer des modèles de données complexes
- Tutoriel MongoDB Create Database
- MongoDB Créer une sauvegarde de base de données