flask database handling how use flask with database
U ovom vodiču za bazu podataka Flask naučite koristiti Flask s raznim bazama podataka, poput Flask MySQL, Flask MongoDB, SQLite itd.
Proširit ćemo koncepte obrađene u našem prvom tutorialu za Flask Python. Počinjemo s upotrebom Flaska s MongoDB-om, NoSQL bazom podataka koja se temelji na dokumentima, gdje NoSQL znači Not Only SQL.
Prvo pokrivamo koncept povezivanja s bazom podataka, a zatim vas obavještavamo kako se ne zaključati s jednom bazom podataka. Ako je potrebno, možemo izmijeniti samo konfiguracije kako bismo promijenili pozadinu baze podataka.
=> Ovdje pogledajte Vodič za savršenu tikvicu
Što ćete naučiti:
Vodič za bazu podataka tikvica
U ovom vodiču čitatelji mogu napraviti usporedbu između raspravljanih baza podataka. Nadalje, govorimo o Flask-MongoEngine, Flask-SQLAlchemy i Flask MongoAlchemy. Ova su dva ORM-a, tj. Map Relation Mapper, prilično popularna.
ORM-ovi ispod haube transparentno prevode objekte (modele baze podataka) u naredbe baze podataka ili SQL izraze.
Prednosti korištenja ORM-a navedene su u nastavku:
- Programeri mogu raditi s objektima umjesto s tablicama i SQL-om.
- Koristite migracije da biste pratili ažuriranja baze podataka.
- Smanjuje troškove razvoja i vrijeme.
- Prevladava SQL razlike specifične za bazu podataka.
Kada koriste ORM-ove, programeri ne moraju pisati složene SQL upite i naredbe za izvođenje osnovnih SQL naredbi.
Povežite se s bazom podataka
Otvorite konfiguracijsku datoteku i primijetite dolje navedene vrijednosti. Flask-Appbuilder uzima podatke baze podataka o nizu veze iz spomenutih vrijednosti.
# The MongoEngine connection string. MONGODB_SETTINGS = { 'DB': 'mydb', 'connect': False, }
Sve značajke niske razine upravljanja bazom podataka od strane ORM-a umotane su pod naredbe Flask Click, što možemo vidjeti pomoću fab-fab -help na naredbenom retku.
Čutura MongoDB
U ovom ćemo odjeljku naučiti kako koristiti ORM-ove, a ne koristiti sirove SQL skripte za rad s bazama podataka u Flasku.
etl ispitivanje pitanja i odgovori za iskusne
MongoDB je nerelacijska baza podataka zasnovana na dokumentima. Već smo ga konfigurirali s našim trenutnim primjerom tutorial tikvice.
Upotrijebite dolje navedene naredbe za upravljanje MongoDB poslužiteljem na lokalnom računalu.
sudo systemctl start mongod # to start MongoDB sudo systemctl stop mongod # to stop MongoDB sudo systemctl status mongod # to check status MongoDB
Razgovarali smo o dva poznata ORM-a koja možete koristiti s MongoDB-om i Flaskom.
Pomoću dizajnera baze podataka stvorili smo dvije tablice pod nazivom Album i pjesma i definirali odnos jedan-prema-više između albuma i pjesme. Dolje je data slika koja prikazuje istu.
Čutura MongoEngine
Ajmo sada stvoriti naš prvi MongoEngine DB model.
Stvorite ili uredite datoteku models.py u direktoriju aplikacije i dodajte sljedeći kôd.
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
Stvorili smo dva MongoEngine modela nazvana Album i Song. Ovi modeli odgovaraju odgovarajućim dokumentima u MongoDB-u.
Album ima jedno polje tipa string s nekim ograničenjima.
- Naziv albuma je jedinstven.
- Ime albuma ne može biti prazno.
- Naziv albuma može sadržavati najviše stotinu znakova.
Slično tome, dokument Pjesma ima naslov, polje za ocjenu i referentno polje koje upućuje na drugi dokument, album. Spremimo ovu datoteku i stvorimo podatke pomoću ova dva modela. Idite u korijenski direktorij projekta i upotrijebite naredbu flask shell da biste pristupili aplikaciji flask u Python ljusci.
Jednom kada uđete u ljusku, upotrijebite donje izjave za pristup modelima MongoEngine i stvorite uzorke podataka kao što je prikazano u nastavku.
>>> from app.models import Album, Song >>> album1 = Album(name='Album1') >>> album1.save() >>> song1 = Song(title='Song1', rating=9, album=album1) >>> song1.save()
Sada pristupimo bazi podataka pomoću Mongo klijenta i provjerimo spremaju li se podaci kao rezultat gore danih izjava. U gornji kod prvo uvozimo Album i pjesmu, a zatim stvaramo njihove objekte s potrebnim vrijednostima parametara.
Ovdje su parametri nazivi polja kako su definirani u modelima, a svoje podatke spominjemo kao vrijednosti tih parametara. Jednom kada je stvaranje objekta uspješno, pozivamo metodu spremanja na odgovarajućim objektima za spremanje dokumenata u bazu podataka.
Upotrijebite naredbu mongo za pristup MongoDB. Jednom kada se povežete s poslužiteljem pomoću mongo klijenta, upotrijebite naredbe u nastavku.
# 1) Provjerite popis baza podataka
> show dbs #----- output ---- admin 0.000GB config 0.000GB local 0.000GB mydb 0.001GB #----- output ----
# 2) Koristite našu bazu podataka koja se naziva mydb
> use mydb #----- output ---- switched to db mydb #----- output ----
# 3) Provjerite zbirke aka tablice u RDBMS-u
> show collections #----- output ---- album permission permission_view role song user view_menu #----- output ----
# 4) Navedite bilo koji dokument u kolekciji albuma.
> db.album.findOne() #----- output ---- { '_id' : ObjectId('5eddb43b8b1e179bef87d41d'), 'name' : 'Album1' } #----- output ----
# 5) Navedite bilo koji dokument u zbirci pjesama.
> db.song.findOne() #----- output ---- { '_id' : ObjectId('5eddb74b0177c8f096d880ec'), 'title' : 'Song1', 'rating' : 9, 'album' : ObjectId('5eddb43b8b1e179bef87d41d') } #----- output ----
Ako ste surađivali s Djangom, shvatit ćete da MongoEngine djeluje vrlo slično ugrađenom Djangovom ORM-u. U zadnjem izlazu, kada smo postavili upit za pjesmu, primijetite kako je referenca drugog dokumenta za polje albuma.
Ajmo sada stvoriti još jedan album i izvršiti ažuriranje postojećeg dokumenta pjesme.
>>> 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()
Uvozimo oba modela, tj. Album i pjesmu. Zatim stvorite novi dokument pod nazivom album2. Upitajte zbirku pjesama u bazi podataka i preuzmite pjesmu koristeći njen naslov. Zatim pristupamo objektu pomoću indeksa niza rezultata upita, ažuriramo pomoću operatora dodjele i spremamo ažurirani dokument.
Krenimo sada ponovo s Mongo klijentom za provjeru pohranjenih zbirki.
> 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') }
U izlazu drugog upita u gornjem isječku, primijetite ažurirano polje albuma dokumenta Song1.
Izbrišimo sada dokumente iz kolekcije albuma i pjesama. Upotrijebite donji kod za uklanjanje zapisa. Ako ste još uvijek u ljusci tikvice, upotrijebite dolje navedene naredbe za brisanje dokumenta i provjeru brisanja.
>>> song1.delete() >>> songs_q = Song.objects(title='Song1') >>> songs_q.count() 0 >>>
Za brisanje dokumenta iz zbirke pjesama koristimo metodu delete na song1. Sve osnovne CRUD operacije mogli smo izvoditi pomoću ljuske tikvice. Nadalje, možemo koristiti ModelView klasu flask_appbuilder za prikaz modela baze podataka kao poglede.
Stvorite poglede temeljene na modelu, kao što je prikazano u donjem kodu.
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)
Prvo uvozimo modele baza podataka, zajedno s ModelView i MongoEngineInterface. Zatim podrazredimo ModelView i dodijelimo određene instance MongoEngineInterface atributu podatkovnog modela naših pogleda.
Registrirajmo sada SongsView i AlbumView na izborniku kao što je prikazano ispod u istoj kategoriji.
appbuilder.add_view(AlbumView, 'Album View', category='Model Views') appbuilder.add_view(SongsView, 'Song View', category='Model Views')
Da biste pristupili tim prikazima u aplikaciji, idite na http: // localhost: 8080 /, prijavite se u aplikaciju pomoću administratorskih vjerodajnica i izvedite dolje navedene korake da biste razumjeli zadane poglede temeljene na modelu baze podataka.
Korak 1: Kliknite izbornik Prikaz modela
Korak 2: Kliknite na podizbornik Prikaz albuma.
Korak 3: Kliknite ikonu plusa da biste stvorili dokument ili zapis.
Korak 4: Unesite naziv albuma i spremite ga.
Slično gornjim koracima, sve CRUD operacije možete izvoditi pomoću ovih pogleda. Stoga, kreirajmo pjesmu pomoću podizbornika View View, kao što je prikazano na donjoj slici. Primijetite, kako se referentno polje povezanog modela baze podataka prikazuje u padajućem izborniku. Pokušajte stvoriti još nekih albuma i pjesama.
Možete dalje istraživati iste koncepte koristeći MongoAlchemy; Još jedan jednostavan za upotrebu i sličan ORM izgrađen za lak pristup MongoDB bazi podataka i manipulaciju pomoću Pythona.
Molimo provjerite dokumentaciju MongoAlchemy ovdje . Međutim, preporučujemo izgradnju osnovnog razumijevanja Flask-SQLAlchemy tako što ćete najprije proći kroz donji odjeljak.
Tikvica Sqlite ili Tikvica MySQL
U ovom odjeljku prenamjenjujemo isti program za SQLAlchemy kao i pozadinski mehanizam. Stoga, molim vas, založite sve svoje dosadašnje promjene i stvorite zasebni Git ogranak - tutorial-3-sqla. Flask može koristiti SQLite i MySQL kao pozadinsku bazu podataka. Preporučujemo da SQLAlchemy koristite kao ORM s ovim relacijskim bazama podataka.
Krenimo s promjenama koje trebamo uvesti nakon što provjerite novu poslovnicu.
Config
Otvorite config.py u korijenskom direktoriju projekta i uklonite niz veze MongoDB. Ažurirajte config.py pomoću niza veze za Flask SQLite ili Flask MySQL.
# The SQLAlchemy connection string. SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db') # SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
Aplikacija __init__.py
Sada otvorite datoteku app / __ init__.py i udaljeni uvoz povezan s MongoEngine i uvezite SQLA kako je prikazano u nastavku.
#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)
Modeli tikvica
Ažurirajte models.py sljedećim kodom i uklonite kôd povezan s MongoEngine.
from flask_appbuilder import Model from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship
Pogledi tikvica
Ažurirajte views.py sljedećim kodom.
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')
Imajte na umu da smo koristili istu klasu ModelView, međutim promijenili smo MongoEngineInterface sa SQLAInterface.
Da bismo stvorili tablice i njihove odgovarajuće odnose, izvršavamo dolje spomenutu naredbu za stvaranje objekata baze podataka.
aplikacije za špijuniranje drugog telefona
flask fab create-db
Ne zaboravite da smo promijenili pozadinu baze podataka. Stoga upotrijebite naredbu fab create-admin tikvice za izradu administratora. Sada pokrenite razvojni poslužitelj kao ranije; koristeći python run.py. Idite na http: // localhost: 8080.
Ovdje će u ovom trenutku naša aplikacija raditi kako je radila u slučaju MongoDB-a. Isprobajte ga sa svim CRUD operacijama, kao što smo to učinili u prethodnim odjeljcima.
Štoviše, prikazali smo obje odgovarajuće tablice za modele baza podataka dok smo koristili SQLite DB preglednik.
Tikvica MySQL
Da bismo koristili MySQL kao pozadinu baze podataka, kada koristimo Flask-SQLAlchemy, trebamo ažurirati samo jednu konfiguraciju koja se tiče baze podataka u config.py.
SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
Prema zadanom nizu veze, naziv baze podataka je myapp. Korisnik za povezivanje s bazom podataka je myapp @ localhost. Međutim, oba su preduvjeta i trebali bismo stvoriti koristeći dolje navedene detalje.
Stoga upotrijebite dolje navedene upite za stvaranje korisnika i baze podataka kako biste Flask MySQL baza podataka radili zajedno. Izvršite ove upite u MySQL klijentu.
CREATE USER 'myapp'@'localhost' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'myapp'@'localhost'; FLUSH PRIVILEGES; CREATE DATABASE myapp;
Također moramo instalirati Python3 mysqlclient. Instalirajte razvojna zaglavlja i knjižnice kako je navedeno u naredbama u nastavku.
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pip install mysqlclient
Sada, jer smo promijenili pozadinu baze podataka, moramo stvoriti tablice koje odgovaraju modelima baze podataka. Također trebamo stvoriti korisnika administratora Flaska jer su sve registrirane stavke izbornika zaštićene i može im pristupiti samo postojeći korisnik u aplikaciji.
Ove naredbe dane u nastavku skrivaju SQL izraze niže razine za ispuštanje i stvaranje tablica.
flask fab create-db flask fab create-admin
Nakon uspješnog dovršenja svih gore navedenih koraka, možemo ponovno prijeći na http: // localhost: 8080. Sada pristupite aplikaciji kao što smo dobili u slučaju Flask SQLite.
Premjestite tikvicu
Tijekom ranog razvoja aplikacije, postoje mnoge promjene u shemi baze podataka. Programeri koji dodaju prilično troškova razvoju vremena moraju često unositi ove promjene. U takvim sličnim scenarijima dodatak Flask-Migrate vrlo je koristan.
Instalirajmo Flask-Migrate.
pip install flask-migrate
Nakon uspješne instalacije dodaje se db naredba. Provjerite uslužne programe naredbenog retka koji su dodani ovoj db naredbi pomoću dolje spomenutog koda.
flask db --help
Prvo, moramo stvoriti objekt za premještanje, kao što je prikazano dolje u app / __ init__.py.
from flask import Flask from flask_migrate import Migrate app = Flask(__name__) migrate = Migrate(app, db)
Isprobajmo neke naredbe s bazom podataka koju imamo u našoj aplikaciji.
Inicijalizirajte zasebno spremište za migraciju.
flask db init
Slično gornjim naredbama, postoje naredbe za stvaranje migracija i njihovu primjenu pomoću naredbe za nadogradnju. Te ćemo naredbe za migraciju koristiti kao dio tijeka rada u našim sljedećim vodičima kad god je to potrebno.
Često postavljana pitanja
Možda ćete naići na neka od pitanja vezanih uz upotrebu baza podataka s Flaskom.
P # 1) Koju bazu podataka koristi Flask?
Odgovor: Flask podržava sve baze podataka koje podržava SQLAlchemy, a koja je skup alata baze podataka za Python i ORM (Object Relation Mapper). Možemo instalirati Flask-SQLAlchemy iz PyPI za rad sa SQLAlchemy.
Flask-Alchemy je dodatak Flask i zahtijeva minimalnu konfiguraciju, osim njegove instalacije. Neke od najčešćih baza podataka koje programeri koriste s Flask-SQLAlchemy su SQLite, PostgreSQL, MySQL itd.
Flask također ima dodatke kao što su Flask-MongoEngine, Flask-MongoAlchemy, Flask-CouchDB itd. Za rad s NoSQL bazama podataka zasnovanim na dokumentima poput MongoDB i CouchDB.
P # 2) Kako mogu stvoriti bazu podataka u tikvici?
Odgovor: Stvaranje baze podataka u tikvici općenito ovisi o uzorku koji slijedi odgovarajući dodatak za flašu. Gotovo svi dodaci stvaraju baze podataka na temelju postavki veze baze podataka definiranih u konfiguraciji Flask u projektu.
Međutim, možete napisati vlastitu metodu za stvaranje baze podataka u Flasku kada ne upotrebljavate dodatak.
U nastavku smo dali trivijalni primjer stvaranja primjera SQLite. Ovaj primjer koristi g Object da zadrži referencu veze baze podataka.
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) Kako prikazujete podatke iz baze podataka u tikvici?
Odgovor: U Flasku programeri koriste razne Object Relational Mappers, koji se nazivaju i ORM. Ovi ORM-ovi obično imaju API-je za pristup bazi podataka pomoću atributa upita za čitanje podataka iz definiranog modela baze podataka. Rezultati upita koji su pohranjeni u Pythonovim podatkovnim strukturama prikazuju se uz pomoć Predložaka tikvica.
Međutim, tijekom testiranja modela baze podataka, rezultati se mogu ispisati i na konzoli u ljusci tikvice.
Jedan takav primjer ispitivanja podataka pomoću API-ja za upite u Flask-SQLAlchemy dan je u nastavku.
>>> user1 = User.query.filter_by(username='testuser').first() >>> user1.id 2 >>> user1.email u'user1@example.org'
Zaključak
U ovom smo tutorijalu pokrili koncepte povezane s povezivanjem različitih baza podataka koristeći isti izgled projekta. Udaljili smo se od paradigme pisanja sirovih SQL upita unutar koda.
apriori algoritam u pretraživanju podataka s primjerom
Pristup pisanju tablica u obliku modela čini nas spretnijima. Također smo pokrili koncepte pohrane podataka iz baze podataka kao migracije. Migracije dodatno dodaju veću fleksibilnost našem razvojnom tijeku rada.
Do sada smo radili na arhetipu koji automatski generira graditelj aplikacija Flask. U našim sljedećim tutorijalima iz ove serije napravit ćemo još jedan korak i razgovarati o ostalim kotlovskim bojlerima i konceptima rada s nacrtima tikvice.
=> Ovdje provjerite SVE tutorijale za tikvice
Preporučena literatura
- Vodič za Python tikvice - Uvod u tikvicu za početnike
- Vodič za API tikvice s primjerom | Proširenje tikvice s API-ima
- Aplikacija tikvice i izgled projekta tikvice s nacrtom i bootstrapom
- Top 31 popularna pitanja za intervju s Python tikvicom s odgovorima
- 10 najboljih alata za dizajn baze podataka za izgradnju složenih modela podataka
- MongoDB Vodič za izradu baze podataka
- MongoDB Stvori sigurnosnu kopiju baze podataka