flask database handling how use flask with database
En aquest tutorial de base de dades de Flask, apreneu a utilitzar Flask amb diverses bases de dades, com ara Flask MySQL, Flask MongoDB, SQLite, etc.
Ampliarem els conceptes tractats en el nostre primer tutorial de Flask Python. Comencem utilitzant Flask amb MongoDB, una base de dades NoSQL basada en documents, on NoSQL significa No només SQL.
En primer lloc, tractem el concepte de connexió amb la base de dades i, a continuació, us informem de com no us quedeu bloquejat amb una base de dades. Si cal, només podem modificar les configuracions per canviar el backend de la base de dades.
=> Consulteu la guia de formació Perfect Flask aquí
Què aprendreu:
Tutorial de la base de dades de Flask
En aquest tutorial, els lectors poden fer una comparació entre les bases de dades discutides. A més, parlem de Flask-MongoEngine, Flask-SQLAlchemy i Flask MongoAlchemy. Aquests dos ORM, és a dir, Object Relation Mapper, són força populars.
Els ORM sota el capó tradueixen de manera transparent els objectes (models de base de dades) en ordres de base de dades o sentències SQL.
A continuació s’enumeren els avantatges d’utilitzar un ORM:
- Els desenvolupadors poden treballar amb objectes en lloc de taules i SQL.
- Utilitzeu Migracions per fer un seguiment de les actualitzacions de la base de dades.
- Redueix els costos i el temps de desenvolupament.
- Supera les diferències SQL específiques de la base de dades.
Quan s’utilitzen ORM, els programadors no han d’escriure comandes i consultes SQL complexes per realitzar ordres SQL bàsiques.
Connecteu-vos a la base de dades
Obriu el fitxer de configuració i observeu els valors esmentats a continuació. Flask-Appbuilder pren els detalls de la base de dades de la cadena de connexió dels valors esmentats.
# The MongoEngine connection string. MONGODB_SETTINGS = { 'DB': 'mydb', 'connect': False, }
Totes les funcions de baix nivell de gestió de bases de dades per part de l’ORM s’han inclòs a les ordres de Flask Click, que podem veure utilitzant flask fab –help a la línia d’ordres.
Flask MongoDB
En aquesta secció, aprendrem a utilitzar ORM en lloc d’utilitzar scripts SQL en brut per treballar amb bases de dades a Flask.
MongoDB és una base de dades no relacional basada en documents. Ja l’hem configurat amb la nostra aplicació d’exemple de tutorial de matràs actual.
Utilitzeu les ordres següents per gestionar el servidor MongoDB a la màquina local.
sudo systemctl start mongod # to start MongoDB sudo systemctl stop mongod # to stop MongoDB sudo systemctl status mongod # to check status MongoDB
Hem parlat de dos famosos ORM que podeu utilitzar amb MongoDB i Flask.
Mitjançant un dissenyador de bases de dades, vam crear dues taules anomenades Àlbum i cançó i vam definir una relació d'un a molts entre àlbum i cançó. A continuació es mostra la imatge que representa el mateix.

Flask MongoEngine
Ara creem el nostre primer model MongoEngine DB.
Creeu o editeu el fitxer models.py al directori de l'aplicació i afegiu el codi següent.
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
Hem creat dos models MongoEngine anomenats Album i Song. Aquests models corresponen als documents respectius de MongoDB.
L'àlbum té un camp de cadena de tipus amb algunes restriccions.
- El nom de l'àlbum és únic.
- El nom de l'àlbum no pot estar en blanc.
- El nom de l'àlbum pot tenir un màxim de cent caràcters.
De la mateixa manera, el document Song té un títol, un camp de classificació i un camp de referència que apunta a un altre document, Àlbum. Desem aquest fitxer i creem dades mitjançant aquests dos models. Aneu al directori arrel del projecte i utilitzeu l’ordre flask shell per accedir a l’aplicació de flask a Python shell.
Un cop introduïu l'intèrpret d'ordres, utilitzeu les instruccions següents per accedir als models MongoEngine i crear dades de mostra com es mostra a continuació.
>>> from app.models import Album, Song >>> album1 = Album(name='Album1') >>> album1.save() >>> song1 = Song(title='Song1', rating=9, album=album1) >>> song1.save()
Ara accedim a la base de dades mitjançant el client Mongo i comprovem si les dades es desen com a resultat de les afirmacions anteriors. Al codi anterior, primer importem Àlbum i Cançó, i després creem els seus objectes amb els valors necessaris dels paràmetres.
Aquí els paràmetres són els noms dels camps definits als models i esmentem les nostres dades com a valors d’aquests paràmetres. Un cop la creació d’objectes tingui èxit, anomenem el mètode save als objectes respectius per desar els documents a la base de dades.
Utilitzeu l'ordre mongo per accedir a MongoDB. Un cop us connecteu al servidor mitjançant el client mongo, utilitzeu les ordres següents.
com puc obrir fitxers swf
# 1) Consulteu la llista de bases de dades
> show dbs #----- output ---- admin 0.000GB config 0.000GB local 0.000GB mydb 0.001GB #----- output ----
# 2) Utilitzeu la nostra base de dades anomenada mydb
> use mydb #----- output ---- switched to db mydb #----- output ----
# 3) Consulteu les taules de les col·leccions de RDBMS
> show collections #----- output ---- album permission permission_view role song user view_menu #----- output ----
# 4) Llista qualsevol document de la col·lecció d'àlbums.
> db.album.findOne() #----- output ---- { '_id' : ObjectId('5eddb43b8b1e179bef87d41d'), 'name' : 'Album1' } #----- output ----
# 5) Llista qualsevol document de la col·lecció de cançons.
> db.song.findOne() #----- output ---- { '_id' : ObjectId('5eddb74b0177c8f096d880ec'), 'title' : 'Song1', 'rating' : 9, 'album' : ObjectId('5eddb43b8b1e179bef87d41d') } #----- output ----
Si heu treballat amb Django, us adonareu que MongoEngine funciona molt semblant a l’ORM incorporat de Django. A l'última sortida, quan vam consultar una cançó, observeu com és la referència d'un altre document per al camp de l'àlbum.
Ara creem un altre àlbum i realitzem una actualització del document de cançó existent.
>>> 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()
Importem els models, és a dir, Àlbum i Cançó. A continuació, creeu un document nou anomenat album2. Consulteu la col·lecció de cançons a la base de dades i obteniu la cançó amb el seu títol. A continuació, accedim a l'objecte mitjançant un índex de matriu del resultat de la consulta, actualitzem mitjançant un operador d'assignació i desem el document actualitzat.
Ara tornem a utilitzar el client Mongo per comprovar les col·leccions emmagatzemades.
> 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') }
A la sortida de la segona consulta del fragment anterior, observeu el camp de l'àlbum actualitzat del document Song1.
Ara suprimim els documents de la col·lecció d'àlbums i cançons. Utilitzeu el codi següent per eliminar els registres. Si encara esteu a l'intèrpret d'ordres del flascó, utilitzeu les ordres esmentades a continuació per suprimir un document i verificar la supressió.
>>> song1.delete() >>> songs_q = Song.objects(title='Song1') >>> songs_q.count() 0 >>>
Utilitzem el mètode d’eliminació de la cançó 1 per suprimir el document de la col·lecció de cançons. Podríem realitzar totes les operacions bàsiques de CRUD utilitzant un flascó. A més, podem utilitzar la classe ModelView de flask_appbuilder per mostrar els models de base de dades com a vistes.
Creeu vistes basades en models, tal com es mostra al codi següent.
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)
Primer importem els models de base de dades, juntament amb ModelView i MongoEngineInterface. A continuació, subclassem ModelView i assignem instàncies particulars de MongoEngineInterface a l'atribut del model de dades de les nostres visualitzacions.
Ara registrem SongsView i AlbumView amb el menú que es mostra a continuació a la mateixa categoria.
appbuilder.add_view(AlbumView, 'Album View', category='Model Views') appbuilder.add_view(SongsView, 'Song View', category='Model Views')
Per accedir a aquestes visualitzacions de l'aplicació, aneu a http: // localhost: 8080 /, inicieu sessió a l'aplicació mitjançant les credencials d'administrador i realitzeu els passos esmentats a continuació per comprendre les visualitzacions predeterminades basades en models de bases de dades.
Pas 1: Feu clic al menú Vista del model

Pas 2: Feu clic al submenú Visualització d'àlbums.

Pas 3: Feu clic a la icona del signe més per crear un document o un registre.

Pas 4: Introduïu el nom de l'àlbum i deseu-lo.
De manera similar als passos anteriors, podeu realitzar totes les operacions CRUD mitjançant aquestes vistes. Per tant, creem una cançó mitjançant el submenú Song View com es mostra a la imatge següent. Tingueu en compte com es mostra un camp de referència d'un model de base de dades relacionat al menú desplegable. Proveu de crear alguns àlbums i cançons més.

Podeu explorar els mateixos conceptes amb MongoAlchemy; Un altre ORM fàcil d'utilitzar i similar construït per facilitar l'accés a la base de dades MongoDB i la seva manipulació mitjançant Python.
Consulteu la documentació de MongoAlchemy aquí . Tot i això, us recomanem que creeu una comprensió bàsica de Flask-SQLAlchemy passant primer per la secció següent.
Flask Sqlite o Flask MySQL
En aquesta secció, tornem a utilitzar la mateixa aplicació per a SQLAlchemy que el motor de backend. Per tant, confieu tots els canvis que heu fet fins ara i creeu un tutorial de branca de Git separat-3-sqla. Flask pot utilitzar SQLite i MySQL com a base de dades de fons. Us recomanem que utilitzeu SQLAlchemy com a ORM amb aquestes bases de dades relacionals.
Comencem pels canvis que hem de fer després de comprovar una nova oficina.
Configuració
Obriu config.py al directori arrel del projecte i traieu la cadena de connexió de MongoDB. Actualitzeu config.py amb la cadena de connexió per a Flask SQLite o Flask MySQL.
com reproduir un fitxer MKV a Windows
# The SQLAlchemy connection string. SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db') # SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
Aplicació __init__.py
Ara obriu el fitxer app / __ init__.py i les importacions remotes relacionades amb MongoEngine i importeu SQLA com es mostra a continuació.
#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)
Models de matràs
Actualitzeu models.py amb el codi següent i elimineu el codi relacionat amb MongoEngine.
from flask_appbuilder import Model from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship
Vistes al matràs
Actualitzeu views.py amb el codi següent.
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')
Tingueu en compte que hem utilitzat la mateixa classe ModelView, però hem canviat MongoEngineInterface amb SQLAInterface.
Per crear les taules i les seves relacions corresponents, executem l'ordre esmentada a continuació per crear objectes de base de dades.
flask fab create-db
Recordeu que hem canviat el backend de la base de dades. Per tant, utilitzeu l’ordre flask fab create-admin per crear l’usuari admin. Ara inicieu el servidor de desenvolupament com abans; utilitzant python run.py. Aneu a http: // localhost: 8080.
En aquest punt, la nostra aplicació funcionarà tal com funcionava en el cas de MongoDB. Proveu-ho amb totes les operacions CRUD, tal com vam fer a les seccions anteriors.
A més, hem mostrat les dues taules corresponents per als models de base de dades mentre s'utilitza SQLite DB Browser.


Flask MySQL
Per utilitzar MySQL com a base de dades de base de dades, quan fem servir Flask-SQLAlchemy, només necessitem actualitzar una configuració relativa a la base de dades a config.py.
SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
Segons la cadena de connexió donada, el nom de la base de dades és myapp. L'usuari que es connecta amb la base de dades és myapp @ localhost. Tot i això, tots dos són requisits previs i els hauríem de crear utilitzant els detalls que es donen a continuació.
Per tant, utilitzeu les consultes que es donen a continuació per crear un usuari i una base de dades per fer que la base de dades Flask MySQL funcioni conjuntament. Executeu aquestes consultes al client MySQL.
CREATE USER 'myapp'@'localhost' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'myapp'@'localhost'; FLUSH PRIVILEGES; CREATE DATABASE myapp;
També hem d’instal·lar Python3 mysqlclient. Instal·leu capçaleres i biblioteques de desenvolupament tal com es mostra a les ordres següents.
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pip install mysqlclient
Ara que hem canviat el backend de la base de dades, hem de crear taules corresponents als models de base de dades. També hem de crear un usuari d'administrador de Flask, ja que tots els elements de menú registrats estan protegits i només pot accedir-hi un usuari existent a l'aplicació.
Aquestes ordres que es mostren a continuació amaguen les sentències SQL de nivell inferior per deixar caure i crear les taules.
flask fab create-db flask fab create-admin
Un cop realitzats tots els passos anteriors amb èxit, podem tornar a navegar a http: // localhost: 8080. Ara accediu a l'aplicació tal com hem obtingut en el cas de Flask SQLite.
Flask Migrate
Durant el desenvolupament inicial d'una aplicació, hi ha molts canvis en l'esquema d'una base de dades. Els desenvolupadors que afegeixen una sobrecàrrega al temps de desenvolupament han de fer aquests canvis amb freqüència. En aquests escenaris similars, el connector Flask-Migrate és força útil.
Instal·lem Flask-Migrate.
eines de recollida de requisits utilitzades pels analistes de negocis
pip install flask-migrate
En instal·lar-se correctament, s’afegeix un subordre de db. Comproveu les utilitats de línia d’ordres que s’afegeixen a aquest subordre de db mitjançant el codi esmentat a continuació.
flask db --help
En primer lloc, hem de crear un objecte de migració, tal com es mostra a continuació a app / __ init__.py.
from flask import Flask from flask_migrate import Migrate app = Flask(__name__) migrate = Migrate(app, db)
Provem algunes ordres amb la base de dades que tenim a la nostra aplicació.
Inicialitzeu un dipòsit de migració independent.
flask db init
De manera similar a les ordres anteriors, hi ha ordres per crear migracions i aplicar-les mitjançant l'ordre upgrade. Utilitzarem aquestes ordres de migració com a part del flux de treball en els nostres tutorials posteriors sempre que sigui necessari.
Preguntes freqüents
És possible que us trobeu amb algunes de les preguntes relacionades amb l’ús de bases de dades amb Flask.
P # 1) Quina base de dades utilitza Flask?
Resposta: Flask admet totes les bases de dades compatibles amb SQLAlchemy, que és un conjunt d'eines de base de dades per a Python i que és un ORM (Object Relation Mapper). Podem instal·lar Flask-SQLAlchemy des de PyPI per treballar amb SQLAlchemy.
Flask-Alchemy és un complement Flask i requereix una configuració mínima que no sigui la seva instal·lació. Algunes de les bases de dades prevalents que els desenvolupadors utilitzen amb Flask-SQLAlchemy són SQLite, PostgreSQL, MySQL, etc.
Flask també té connectors com Flask-MongoEngine, Flask-MongoAlchemy, Flask-CouchDB, etc. per treballar amb bases de dades basades en documents NoSQL com MongoDB i CouchDB.
Q # 2) Com puc crear una base de dades a Flask?
Resposta: La creació d’una base de dades a Flask depèn generalment del patró seguit del complement Flask corresponent. Gairebé tots els connectors creen bases de dades basades en els paràmetres de connexió de base de dades definits a la configuració de Flask al projecte.
Tot i això, podeu escriure el vostre propi mètode per crear una base de dades a Flask quan no utilitzeu un connector.
A continuació hem donat un exemple trivial de crear un exemple SQLite. Aquest exemple utilitza g Object per mantenir la referència de la connexió de base de dades.
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()
P # 3) Com es mostren les dades d'una base de dades a Flask?
Resposta: A Flask, els desenvolupadors utilitzen diversos mapes relacionals d’objectes, també anomenats ORM. Aquests ORM generalment tenen API per accedir a la base de dades mitjançant l'atribut de consulta per llegir les dades d'un model de base de dades definit. Els resultats de les consultes que s’emmagatzemen a les estructures de dades de Python es mostren amb l’ajut de les plantilles Flask.
No obstant això, mentre es proven els models de base de dades, els resultats també es poden imprimir a la consola de Flask Shell.
A continuació es mostra un exemple d’aquest tipus de consulta de dades mitjançant l’API de consultes a Flask-SQLAlchemy.
>>> user1 = User.query.filter_by(username='testuser').first() >>> user1.id 2 >>> user1.email u'user1@example.org'
Conclusió
En aquest tutorial, hem tractat conceptes relacionats amb la connexió a diferents bases de dades mitjançant el mateix disseny de projecte. Ens vam allunyar del paradigma d’escriure consultes SQL crues dins del codi.
Una aproximació a l’escriptura de taules en forma de models ens fa més àgils. També vam tractar els conceptes d’emmagatzemar informació de la base de dades com a migracions. Les migracions afegeixen més flexibilitat al nostre flux de treball de desenvolupament.
Fins ara, hem treballat en un arquetip que el generador d'aplicacions Flask genera automàticament. Als nostres propers tutorials d’aquesta sèrie, fem un pas més i discutim sobre les altres plaques de caldera de Flask i els conceptes de treballar amb els plans de Flask.
=> Consulteu aquí TOTS els tutorials de Flask
Lectura recomanada
- Python Flask Tutorial: Introducció a Flask per a principiants
- Tutorial API de Flask amb exemple | Ampliant Flask amb API
- Aplicació de Flask i disseny del projecte Flask amb Blueprint & Bootstrap
- Top 31 de les preguntes més populars de l'entrevista de Python Flask amb respostes
- Top 10 eines de disseny de bases de dades per crear models de dades complexos
- Tutorial de creació de bases de dades de MongoDB
- MongoDB Crea una còpia de seguretat de la base de dades