Какие существуют способы интеграции баз данных с фреймворком Flask

Ответ

Интеграция Flask с базами данных обычно выполняется одним из трех основных способов, в зависимости от типа БД и уровня абстракции.

1. Использование ORM (Object-Relational Mapping)

Это самый распространенный подход для реляционных СУБД (PostgreSQL, MySQL, SQLite). Он позволяет работать с таблицами базы данных как с Python-классами.

  • Flask-SQLAlchemy — самое популярное расширение, которое интегрирует мощную библиотеку SQLAlchemy во Flask.
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
# Строка подключения к базе данных
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
db = SQLAlchemy(app)

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

# Для управления миграциями схемы используется Flask-Migrate (на базе Alembic)

2. Работа с NoSQL базами данных

Для документо-ориентированных баз, таких как MongoDB, используются специализированные библиотеки (ODM - Object-Document Mapper).

  • Flask-MongoEngine — обеспечивает интеграцию с MongoEngine, позволяя определять схемы документов в виде классов.
from flask import Flask
from flask_mongoengine import MongoEngine

app = Flask(__name__)
app.config['MONGODB_SETTINGS'] = {
    'db': 'mytumblelog',
    'host': 'localhost',
    'port': 27017
}
db = MongoEngine(app)

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)

3. Прямые SQL-запросы

Для полного контроля можно использовать драйверы баз данных напрямую (например, psycopg2 для PostgreSQL). В этом подходе важно правильно управлять жизненным циклом соединения в контексте запроса Flask.

import psycopg2
from flask import g

def get_db():
    # Используем глобальный объект g для хранения соединения в рамках одного запроса
    if 'db' not in g:
        g.db = psycopg2.connect("dbname=test user=postgres")
    return g.db

@app.teardown_appcontext
def close_db(e=None):
    db = g.pop('db', None)
    if db is not None:
        db.close()