Операции с базой данных во Flask
Во Flask операции с базами данных являются важным аспектом создания веб-приложений.
Flask предоставляет несколько способов взаимодействия с базами данных, включая прямое использование SQL и применение инструментов ORM (объектно-реляционного отображения), таких как SQLAlchemy.
Ниже приведено подробное объяснение операций с базами данных во Flask, включая базовые операции с использованием SQLAlchemy и прямое выполнение SQL-инструкций.
- Использование SQLAlchemy: Определите модели, настройте базу данных и выполняйте базовые CRUD-операции.
- Создание баз данных и управление ими: Используйте
db.create_all()Создайте таблицу. - CRUD-операции: Добавляйте, читайте, обновляйте и удаляйте записи.
- Операции с запросами: Выполняйте простые и сложные запросы, включая сортировку и пагинацию.
- Flask-Migrate: Используйте Flask-Migrate для управления миграциями базы данных.
- Выполнение необработанного SQL: Используйте необработанные SQL-инструкции для операций с базой данных.
1. Использование SQLAlchemy
SQLAlchemy — это мощная ORM-библиотека, которая упрощает операции с базой данных, взаимодействуя с таблицами базы данных через объекты Python.
Flask-SQLAlchemy — это расширение Flask для интеграции SQLAlchemy.
Установка Flask-SQLAlchemy
pip install flask-sqlalchemy
Настройка SQLAlchemy
Код файла app.py:
Пример
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 для таблицы базы данных; каждый класс модели представляет таблицу в базе данных.
Пример
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
Создание записи
Пример
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(): Зафиксировать транзакцию, чтобы сохранить изменения в базе данных.
Чтение записи
Пример
def get_users():
users = User.query.all() # Получить всех пользователей
return '<br>'.join([f'{user.username} ({user.email})' for user in users])
User.query.all(): Запросить все записи пользователей.
Обновление записи
Пример
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): Запрос одной записи пользователя по первичному ключу.
Обновите значения полей и зафиксируйте транзакцию.
Удаление записи
Пример
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-запросы.
Пример
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_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:
Пример
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:
Пример
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:
Пример
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)