Операции с базой данных во Flask

Во Flask операции с базами данных являются важным аспектом создания веб-приложений.

Flask предоставляет несколько способов взаимодействия с базами данных, включая прямое использование SQL и применение инструментов ORM (объектно-реляционного отображения), таких как SQLAlchemy.

Ниже приведено подробное объяснение операций с базами данных во Flask, включая базовые операции с использованием SQLAlchemy и прямое выполнение SQL-инструкций.

  1. Использование SQLAlchemy: Определите модели, настройте базу данных и выполняйте базовые CRUD-операции.
  2. Создание баз данных и управление ими: Используйтеdb.create_all()Создайте таблицу.
  3. CRUD-операции: Добавляйте, читайте, обновляйте и удаляйте записи.
  4. Операции с запросами: Выполняйте простые и сложные запросы, включая сортировку и пагинацию.
  5. Flask-Migrate: Используйте Flask-Migrate для управления миграциями базы данных.
  6. Выполнение необработанного SQL: Используйте необработанные SQL-инструкции для операций с базой данных.

1. Использование SQLAlchemy

SQLAlchemy — это мощная ORM-библиотека, которая упрощает операции с базой данных, взаимодействуя с таблицами базы данных через объекты Python.

Flask-SQLAlchemy — это расширение Flask для интеграции SQLAlchemy.

Установка Flask-SQLAlchemy

pip install flask-sqlalchemy

Настройка SQLAlchemy

Код файла app.py:

Пример

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'  # Использовать базу данных SQLite
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

2. Определение модели

Модель — это класс Python для таблицы базы данных; каждый класс модели представляет таблицу в базе данных.

Пример

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

    def __repr__(self):
        return f'<User {self.username}>'

db.Model: Все классы моделей должны наследоваться от db.Model.

db.Column: Определите поля модели, указав такие атрибуты, как тип поля, является ли оно первичным ключом, уникально ли оно, может ли оно быть null, и т. д.

3. Создание и управление базами данных

Создание базы данных и таблиц

После определения моделей вы можете использовать методы, предоставляемые SQLAlchemy, для создания базы данных и таблиц.

with app.app_context():
    db.create_all()

db.create_all(): Создать таблицы, соответствующие всем моделям, определённым в текущем контексте.

4. Основные операции CRUD

Создание записи

Пример

@app.route('/add_user')
def add_user():
    new_user = User(username='john_doe', email='[email protected]')
    db.session.add(new_user)
    db.session.commit()
    return 'Пользователь добавлен!'

db.session.add(new_user): Добавить новый объект пользователя в сессию.

db.session.commit(): Зафиксировать транзакцию, чтобы сохранить изменения в базе данных.

Чтение записи

Пример

@app.route('/get_users')
def get_users():
    users = User.query.all()  # Получить всех пользователей
    return '<br>'.join([f'{user.username} ({user.email})' for user in users])

User.query.all(): Запросить все записи пользователей.

Обновление записи

Пример

@app.route('/update_user/<int:user_id>')
def update_user(user_id):
    user = User.query.get(user_id)
    if user:
        user.username = 'new_username'
        db.session.commit()
        return 'Пользователь обновлён!'
    return 'Пользователь не найден!'

User.query.get(user_id): Запрос одной записи пользователя по первичному ключу.

Обновите значения полей и зафиксируйте транзакцию.

Удаление записи

Пример

@app.route('/delete_user/<int:user_id>')
def delete_user(user_id):
    user = User.query.get(user_id)
    if user:
        db.session.delete(user)
        db.session.commit()
        return 'Пользователь удалён!'
    return 'Пользователь не найден!'

db.session.delete(user): Удалить запись пользователя и зафиксировать транзакцию.

5. Операции запросов

SQLAlchemy предоставляет богатые возможности запросов, позволяя выполнять различные операции запросов через объекты запросов.

Базовый запрос

users = User.query.filter_by(username='john_doe').all()

filter_by(): Фильтрация записей по значению поля.

Сложный запрос

from sqlalchemy import or_

users = User.query.filter(or_(User.username == 'john_doe', User.email == '[email protected]')).all()

or_(): Используется для выполнения сложных условий запроса.

Сортировка и пагинация

users = User.query.order_by(User.username).paginate(page=1, per_page=10)

order_by(): Сортировка по указанному полю.

paginate(): Запрос с пагинацией.

6. Используйте Flask-Migrate для миграций.

Flask-Migrate — это расширение для миграций базы данных, основанное на Alembic, которое помогает управлять версионированием базы данных.

Установка Flask-Migrate

pip install flask-migrate

Настройка Flask-Migrate

Код файла app.py:

from flask_migrate import Migrate

migrate = Migrate(app, db)

Инициализация миграции

flask db init

Создание скриптов миграции

flask db migrate -m "Initial migration."

Применение миграции

flask db upgrade
  • flask db init: Инициализировать окружение миграции.
  • flask db migrate -m "message": Создать скрипт миграции.
  • flask db upgrade: Применить миграции к базе данных.

7. Выполнение необработанного SQL

Хотя SQLAlchemy предоставляет функциональность ORM, вы также можете выполнять необработанные SQL-запросы.

Пример

@app.route('/raw_sql')
def raw_sql():
    result = db.session.execute('SELECT * FROM user')
    return '<br>'.join([str(row) for row in result])

db.session.execute(): Выполнить необработанный SQL-запрос.

Подключение к базе данных MySQL и работа с ней во Flask

Подключение к базе данных MySQL и работа с ней во Flask обычно включает использование SQLAlchemy или прямое использование драйверов Python для MySQL. Ниже приведены подробные шаги, включая использование Flask-SQLAlchemy и прямое использование драйверов Python для MySQL.

1. Использование Flask-SQLAlchemy для подключения к MySQL

Flask-SQLAlchemy — это расширение Flask, которое упрощает настройку и работу с SQLAlchemy. Чтобы подключиться к MySQL, необходимо установить Flask-SQLAlchemy и драйвер MySQL.

Установите необходимые библиотеки:

pip install flask-sqlalchemy mysqlclient
  • flask-sqlalchemy: Расширение SQLAlchemy для Flask.
  • mysqlclient: Драйвер Python для базы данных MySQL.

Настройка Flask-SQLAlchemy

Код файла app.py:

Пример

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

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

code>SQLALCHEMY_DATABASE_URI: Задает URI подключения к базе данных, формат —mysql://username:password@localhost/dbname。

  • username: Имя пользователя MySQL.
  • password: пароль MySQL.
  • localhost: адрес хоста MySQL (обычно local —localhost)。
  • dbname: имя базы данных.

Определение моделей и выполнение базовых операций

Код файла app.py:

Пример

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

    def __repr__(self):
        return f'<User {self.username}>'

@app.route('/')
def index():
    users = User.query.all()
    return '<br>'.join([f'{user.username} ({user.email})' for user in users])

if __name__ == '__main__':
    with app.app_context():
        db.create_all()  # Создать таблицу базы данных
    app.run(debug=True)

Использовать Python-драйвер MySQL напрямую.

Если вы решите не использовать SQLAlchemy, а напрямую использовать Python-драйвер MySQL, вы можете использовать библиотеку mysql-connector-python или PyMySQL.

Установите mysql-connector-python:

pip install mysql-connector-python

Установите PyMySQL (если вы решите использовать PyMySQL):

pip install PyMySQL

Используйте mysql-connector-python для подключения к MySQL

Код файла app.py:

Пример

from flask import Flask, request, jsonify
import mysql.connector

app = Flask(__name__)

def get_db_connection():
    connection = mysql.connector.connect(
        host='localhost',
        user='username',
        password='password',
        database='dbname'
    )
    return connection

@app.route('/add_user', methods=['POST'])
def add_user():
    data = request.json
    name = data['name']
    email = data['email']

    connection = get_db_connection()
    cursor = connection.cursor()
    cursor.execute('INSERT INTO user (username, email) VALUES (%s, %s)', (name, email))
    connection.commit()
    cursor.close()
    connection.close()

    return 'Пользователь добавлен!'

@app.route('/get_users')
def get_users():
    connection = get_db_connection()
    cursor = connection.cursor(dictionary=True)
    cursor.execute('SELECT * FROM user')
    users = cursor.fetchall()
    cursor.close()
    connection.close()

    return jsonify(users)

if __name__ == '__main__':
    app.run(debug=True)

Используйте PyMySQL для подключения к MySQL, код файла app.py:

Пример

from flask import Flask, request, jsonify
import pymysql

app = Flask(__name__)

def get_db_connection():
    connection = pymysql.connect(
        host='localhost',
        user='username',
        password='password',
        database='dbname',
        cursorclass=pymysql.cursors.DictCursor
    )
    return connection

@app.route('/add_user', methods=['POST'])
def add_user():
    data = request.json
    name = data['name']
    email = data['email']

    connection = get_db_connection()
    with connection.cursor() as cursor:
        cursor.execute('INSERT INTO user (username, email) VALUES (%s, %s)', (name, email))
        connection.commit()

    connection.close()
    return 'Пользователь добавлен!'

@app.route('/get_users')
def get_users():
    connection = get_db_connection()
    with connection.cursor() as cursor:
        cursor.execute('SELECT * FROM user')
        users = cursor.fetchall()

    connection.close()
    return jsonify(users)

if __name__ == '__main__':
    app.run(debug=True)
Другие расширения