20 mar 2017

Przegląd dostępnych rozwiązań do połączenia Flask i MySQL

Ten post jest pierwszą częścią opisu współpracy Flask i MySQL. Kiedy zacząłem tworzyć wpis dotyczący połączenia bazy i backendu w moim projekcie, to chciałem w nim opisać kompleksowo wszystko czego się nauczyłem w trakcie poznawania Flask. Post rozrósł się do ogromnego wypracowania, dlatego został podzielony na części. Dzisiaj opiszę dostępne metody takiego połączenia, na pewno pojawi się również opis konkretnego wdrożenia na przykładzie Portfela Emerytalnego. Być może na tym się nie skończy, bo temat jest naprawdę obszerny.

Poszukiwania metody połączenia się z bazą przyniosły odkrycie, że istnieje kilka modułów których możemy użyć w tym celu. Znalezione przeze mnie to:
Wymieniłem tylko takie związane wprost z Flask, bo dla samego Pythona istnieje ich wiele więcej (MySQLdb, mysqlclient, Connector/Python, SQLObject, peewee, PonyORM itd.). Taki wybór w założeniu ma zapewnić brak problemów w użyciu w połączeniu z Flask.
Krótki opis każdego z modułów (forma jest celowo dość ścisła, post ma być szybką ściągawką dla mnie i być innych szukających tego typu zestawienia).

Flask-MySQL

Strona projektu: https://flask-mysql.readthedocs.io
Chyba najprostszy z wymienionych modułów, oparty na wymienionym powyżej MySQLdb. Niestety z tego powodu działa tylko z Python w wersji 2.4-2.7. Dla mnie nie jest to problem, ale jeśli ktoś pisze w Python 3+ to nie skorzysta z tego rozszerzenia. Ciągle dość popularny i dobrze wypozycjonowany, ja jednak nie będę go używał.

Inicjalizacja:
from flask import Flask
from flaskext.mysql import MySQL

app = Flask(__name__)
mysql = MySQL()
app.config['MYSQL_DATABASE_HOST'] = 'localhost'
app.config['MYSQL_DATABASE_USER'] = 'db_username'
app.config['MYSQL_DATABASE_PASSWORD'] = 'db_password'
app.config['MYSQL_DATABASE_DB'] = 'db_name'
mysql.init_app(app)
Użycie:
connection = mysql.connect()
cursor = connection.cursor()
cursor.execute("SELECT * FROM user")
data = cursor.fetchall()

Flask-MySQLdb

Strona projektu: http://flask-mysqldb.readthedocs.io
W skrócie i uproszczeniu: ulepszona wersja poprzedniego modułu, obsługuje Python 3. Zacytuję wypowiedź autora którą znalazłem:
I wrote it because back then flask-mysql didn't work outside of a request context (not sure if it does now) and because it's based on MySQL-python while flask-mysqldb is based on mysqlclient which is fully backwards compatible fork of MySQL-python and is compatible with Python 3.3+. You mentioned you're using Python 3.4.3 so flask-mysql will not work.
flask-mysqldb is really meant to be a tiny, tiny wrapper for mysqlclient so if you need something more like an ORM flask-sqlalchemy is definitely the way to go.
Inicjalizacja:
from flask import Flask
from flask_mysqldb import MySQL

app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'db_username'
app.config['MYSQL_PASSWORD'] = 'db_password'
app.config['MYSQL_DB'] = 'db_name'
mysql = MySQL(app)
Użycie:
cursor = mysql.connection.cursor()
cursor.execute("SELECT * FROM user")
data = cursor.fetchall()

Flask-SQLAlchemy

Strona projektu: http://flask-sqlalchemy.pocoo.org/2.1/
Bardziej ORM niż prosty moduł do połączenia z bazą. Najpopularniejszy wśród Pythonowych ORMów, prawdopodobnie dlatego dorobił się dedykowanego modułu dla Flask.

Inicjalizacja:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '' % self.username
Użycie:
data = User.query.all()

0 komentarze:

Prześlij komentarz