Какие существуют способы интеграции баз данных с фреймворком 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()

Ответ 18+ 🔞

Ах ты ж ёпта, ну и тема подкинули! Слушай, тут про интеграцию Flask с базами данных, а это, блядь, как три дороги в сказке — налево пойдёшь, направо пойдёшь, прямо пойдёшь... И везде, сука, свои подводные ебли!

1. ORM — это типа как переводчик с языка таблиц на человеческий

Для реляционных баз (PostgreSQL, MySQL, SQLite) берут обычно эту штуку. Вместо того чтобы вручную SQL-запросы строить, ты работаешь с таблицами как с обычными питоновскими классами. Красота, блядь!

  • Flask-SQLAlchemy — это, сука, царь и бог в этом деле. Обёртка над SQLAlchemy, которая делает всё почти магически.
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 — тут уже документы, а не таблицы

Если твоя база — это не аккуратные столбики, а свалка JSON'ов в лице MongoDB, то тут свои приблуды. ODM вместо ORM, но суть та же — общаться с базой через объекты.

  • Flask-MongoEngine — прикручивает MongoEngine к Flask. Определяешь структуру документа классом и вперёд.
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) и пишешь запросы руками. Главное тут — не накосячить с открытыми соединениями, а то сервер ляжет, и будет тебе пиздец, а не приложение.

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() # Обязательно закрывай за собой, а то мамка ругаться будет!

Вот и вся магия, ёпта. Выбирай, что по душе, но помни: с великой силой приходит и великая, блядь, ответственность не наебаться с коннектами!