SQLAlchemy, to wyższy poziom operacji na bazach danych. Definiujemy klasę, a następnie dzięki SQLAlchemy, możemy w łatwy sposób przetłumaczyć ją na tabele w bazie danych. Później, bez potrzeby wykorzystania języka SQL, wykonywać na niej wszelakie operacje. Flask SQLAlchemy to dostosowana na potrzeby Flaska jej wersja, która sprawia, że użycie jest jeszcze łatwiejsze i przyjemniejsze.

Polecamy wcześniejsze zapoznanie się z SQLAlchemy, w tym artykule <tutaj>, oraz z samym Flask, w tym artykule <tutaj>.

Minimalny projekt, z użyciem Flask SQLAlchemy

Poniżej utworzymy prosty program, który tworzy klasę z informacjami na temat transakcji kupna, a następnie na jej podstawie utworzymy tabelę w bazie danych. Całość operacji jest podobna do klasycznego SQLAlchemy, jednak uproszczone.

Utworzymy 3 plik:

  • base.py – zdefiniujemy klasę Transakcję, utworzymy bazę danych oraz tabelę
  • insert.py – dodamy do bazy danych kilka obiektów klasy Transakcje
  • select.py – odczytamy dane na temat Transakcji z bazy danych

Należy również zainstalować samą bibliotekę

$pip install flask-sqlalchemy

base.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///C:\\Python\\BED\\flask-sqlalchemy.sqlite'
db = SQLAlchemy(app)


class Transakcje(db.Model):

    __tablename__ = 'transakcje'

    transakcja_id = db.Column(db.Integer, primary_key=True )
    data = db.Column(db.String)
    przedmiot_id = db.Column(db.Integer)
    cena = db.Column(db.Integer)

    def __init__(self, transakcja_id, data, przedmiot_id, cena):
        self.transakcja_id = transakcja_id
        self.data = data
        self.przedmiot_id = przedmiot_id
        self.cena = cena

db.create_all()

Widzimy bardzo duże podobieństwo do SQLAlchemy, tyle że mamy tutaj obiekt SQLAlchemy pochodzący z biblioteki flask_sqlalchemy, który upraszcza sytuację.

Mając nasz plik base.py, w banalny, banalny sposób, możemy zapisywać oraz odczytywać z bazy danych.

insert.py

import base

for x in range(0,20):
    new_transaction = base.Transakcje(x, '2020/05/05',12,19)
    base.db.session.add(new_transaction)

base.db.session.commit()

W ten sposób dodaliśmy 20 transakcji do naszej bazy danych. Ani jednej linijki SQL. Wykorzystaliśmy tutaj sesją z db oraz zrobiliśmy commit(), aby zapisać zmiany w bazie danych.

select.py

import base

for t in base.Transakcje.query.all():
    print(t.transakcja_id)

A tak odczytaliśmy z bazy danych. Ponownie ani linijki w języku SQL.

Minimalistyczne REST API, z użyciem Flask SQLAlchemy

Zobaczmy jak proste jest utworzenie minimalistycznego REST API, które jest dostępne pod adresem /transakcja/<numer> i zwraca datę utworzenia transakcji o danym numerze.

Wykorzystamy plik base.py, tak więc nie musimy tworzyć nowej aplikacji we Flasku.

Wszystko zapiszemy do pliku restapi.py

restapi.py

import base

@base.app.route('/transakcja/<numer>')
def transakcja(numer):
    tr = base.Transakcje.query.filter_by(transakcja_id=int(numer)).first().first()
    return tr.data

if __name__ == '__main__':
    base.app.run()

Podsumowanie Flask SQLAlchemy

Flask SQLAlchemy to biblioteka która bardzo często wykorzystuje się razem z Flaskiem. Działa tak samo jak klasyczne SQLAlchemy, jednak wprowadza kilka ułatwień.

Bardzo szybko, początkowy nakład pracy poświęconej na początkowe zdefiniowanie klas, zwróci się nam nie musząc odwoływać się do bazy danych za pomocą SQL.

Polecamy!