Добавьте функциональность в свои приложения Flask с помощью баз данных
Чтобы данные в приложениях имели смысл, они должны быть связаны тем или иным образом. Рассмотрим ваши любимые социальные сети, как пользователь, у вас есть специальное пространство для публикации таких вещей, как фотографии и видео, вы даже можете взаимодействовать с другими пользователями. через лайки, прямые сообщения и так далее.
Реляционные базы данных
Реляционная база данных используется для управления данными. Реляционные базы данных состоят из таблиц, представляющих сущности. Они также представляют отношения между сущностями. Например, у артиста могут быть разные альбомы, у человека может быть много увлечений и так далее.
Схема базы данных
Схема базы данных описывает способ представления объектов. Рассмотрим изображение ниже, которое описывает отношения между двумя таблицами.
Flask-SQLAlchemy
Согласно документации:
Flask-SQLAlchemy — это расширение для Flask, добавляющее поддержку SQLAlchemy в ваше приложение. Он направлен на упрощение использования SQLAlchemy с Flask, предоставляя полезные значения по умолчанию и дополнительные помощники, облегчающие выполнение общих задач.
Создайте приложение Flask с помощью Flask-SQLAlchemy.
Создайте каталог для своего приложения и создайте виртуальную среду.
mkdir flaskdb python3.8 -m venv env
Активируйте виртуальную среду и создайте файл app.py
source env/bin/activate touch app.py
Установите Flask и flask_sqlachemy через pip
pip3 install Flask-SQLAlchemy pip3 install Flask
Откройте app.py
и импортируйте Flask
и SQLAlchemy
.
from flask import Flask from flask_sqlalchemy import SQLAlchemy
Затем создайте экземпляр приложения Flask.
app = Flask(__name__)
Конфигурации базы данных
Можно использовать несколько баз данных, таких как SQLite, MYSQl или Postgres. В нашем случае мы будем использовать SQLite, так как он легкий и простой в использовании.
Сначала мы указываем путь к файлу базы данных и создаем экземпляр базы данных, используя класс SQLAchemy
.
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydb.db' db = SQLAlchemy(app)
Маршрутизация
Давайте добавим простой маршрут, который отображает «Hello World».
@app.route('/home') def home(): return "Hellow World."
Когда вы запустите приложение, вы должны увидеть следующее.
Чтобы скрыть это предупреждение, установите для параметра SQLALCHEMY_TRACK_MODIFICATIONS
значение False.
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Снова запустите сервер и перейдите по адресу https://127.0.0.1:5000/home.
Создание моделей
Экземпляр db, который мы создали выше, хранит базовый класс (db.Models) для всех моделей. Он также содержит все функции и помощники из sqlalchemy
и sqlalchemy.orm
.
Базовый класс (db.Models
) используется для объявления моделей. Мы создадим 2 модели для нашего приложения, а именно модели Book
и Author
. Отношения между ними показаны на схеме ниже.
Создайте модели:
В приведенном выше коде в имени класса модели мы объявляем атрибуты, равные db.Column()
. db.Column()
принимает следующие атрибуты
- тип данных
- основной ключ
- ограничения
- по умолчанию
Функция __repr__
обеспечивает удобочитаемое представление наших моделей.
Отношения между моделями
Мы знаем, что у Автора может быть много книг; как мы объявляем отношения в базе данных?. К счастью, SQLAlchemy предоставляет метод db.relationship()
для объявления взаимосвязей.
Чтобы объявить отношение "один ко многим" между моделями Author
и Book
, добавьте полевые книги в модель Author
.
Сначала мы указываем связь с моделью Book и добавляем автора backref
. backref
объявляет новое свойство в классе Author, так что мы можем использовать author.books
для получения книг конкретного автора. Свойство lazy определяет, как данные будут загружаться из базы данных
До сих пор у нас было отношение «один ко многим» между Author
и Book
; нам также необходимо указать внешний ключ на стороне отношения «многие» (т. е. модель Book
).
На данный момент ваш app.py
file должен выглядеть так:
Создайте базу данных
Сразу после классов модели инициируйте базу данных с помощью команды db.create_all()
.
db.create_all()
Вы также можете сделать это через интерактивную подсказку оболочки. Сначала введите команду.
python3
Ваш терминал должен выглядеть так:
Python 3.8.9 (default, Apr 3 2021, 01:02:10)
[GCC 5.4.0 20160609] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>>
Далее импортируем db
и создаем таблицы из заявленных моделей.
>>> from app import db >>> db.create_all()
Команда db.create_all()
создает фактические таблицы в базе данных. Кроме того, в каталоге вашего проекта должен появиться файл mydb.db
. Теперь вы можете начать заполнять базу данных записями о книгах и авторах.
Создание записей в базе данных
Чтобы создать экземпляр Book или Author с помощью терминала, сначала импортируйте db
и классы модели.
>>> from app import app Book, Author
Создайте объект автора с именем author1 с id = 1
, чьи имена — John Doe, а его адрес электронной почты — [email protected].
>>> a1 = Author(id = 1, first_name = "john" , last_name = "doe", email = "[email protected]") >>> db.session.add(a1) >>> db.commit()
Вы можете запросить информацию об авторе с помощью точечной нотации Python.
>>> a1 <Author 1> >>> a1 <Author 1> >>> a1.first_name 'john' >>>
Создание записей базы данных с отношениями
Предположим, автор (Джон Доу), которого мы создали выше, является автором книги с названием «Алембик». Давайте создадим связь в базе данных.
Создайте книгу object
под названием book1
с id = 1
, с названием Alembic и годом выпуска 1990.
>>> b1 = Book(id = 1, title = "ALEMBIC", year = "1990", author_id = a1.id) >>> db.session.add(b1) >>> db.session.commit()
Теперь, если вы запросите книги, созданные автором 1, вы должны получить следующий объект запроса.
>>> a1 = Author(id =1) >>> a1 >>> a1_books = a1.books >>> a1_books <sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x7f1eab5e7280>
Как видите, база данных уже создала связь между моделями Author
и Book
.
Запросы к базе данных
Класс модели SQLAlchemy предоставляет свойство query
, которое используется для запросов к таблицам базы данных.
Есть 2 способа выполнения запросов в Flask.
query.get()
—query.get()
извлечет только 1 объект из базы данных, иначе это приведет к ошибке.query.all()
—query.all()
будет получать несколько объектов.
Создайте новый файл query.py
, в котором мы будем выполнять наши запросы. Импортируйте модели db
, Author
и Book
вверху.
#query.py from app import db, Author, Book
Предположим, вы хотите получить определенную информацию из базы данных; как бы вы это сделали? Например, чтобы получить фамилию автора с id = 1
.
author1 = Author.query.get(1) print(author1.last_name) # Result 'doe'
Чтобы получить все книги в базе данных:
Результат вышеуказанного запроса:
The book ALEMBIC was published in 1990 The book Comedy of Errors was published in 1591 The book Titus Andronicus was published in 1593 The book Two Gentlemen of Verona was published in 1591 The book Romeo and JUliet was published in 1594 The book Love's Labour's Lost was published in 1594
Запрос связанных объектов
До сих пор мы делали запросы только из одной модели за раз. Мы знаем, что у автора может быть много книг, так как это отношение объявлено в базе данных с помощью метода db. relationship
. Предположим, вы хотите получить все книги автора с id =2
.
Результат вышеуказанного запроса:
The tempest Comedy of Errors Titus Andronicus Two Gentlemen of Verona Love's Labour's Lost
Теперь давайте начнем с многосторонней стороны отношений (модель Book
) и получим author_id
книги.
book2 = Book.query.get(2) book2_author_id = book2.author_id print(book2_author_id) # Result is 2
Поскольку у книги только 1 автор, мы используем .get()
.
Фильтрация
Фильтрация позволяет извлекать записи, соответствующие определенным условиям. Например, чтобы получить все книги, изданные в 1594 году, мы выполняем следующий запрос.
books_in_1594 = Book.query.filter(Book.year == 1594).all()
Расширенная фильтрация
Вам также может потребоваться получить данные в определенном порядке, т. е. по дате, в порядке возрастания или убывания и т. д. Например, чтобы отфильтровать все книги по году выпуска, нужно:
books_by_year = Book.query.order_by(Book.year).all()
Обновление записей
Обновление сведений о записи в базе данных — обычное дело. Допустим, вы хотите обновить данные электронной почты автора с помощью id =1
; вы бы сделали это, сначала выбрав автора object
из базы данных, присвоив email
новое значение, а затем зафиксировав изменения в базе данных.
>>> author_id1 = Author.query.get(1) >>> author_id1.email = "johndoe2022@gmailcom" >>> db.session.commit()
Если вы сделаете запрос, адрес электронной почты изменится.
>>> author_id1.email 'johndoe2022@gmailcom'
Удаление записей
Удаление записей в базе данных имеет решающее значение для любого приложения. Если мы хотим удалить определенную информацию в нашем приложении, мы можем сделать это с помощью команды db. session.delete
.
Например, чтобы удалить книгу с id =6
, мы выполняем следующий запрос.
db.session.delete(Book.query.get(6))
Заключение
Вкратце, в этом руководстве рассказывается, как создать приложение фляги, инициализировать базу данных, как выполнять запросы и управлять записями в базе данных. Спасибо за прочтение.
Привет, друг! Если ты хочешь прочитать больше этих руководств, рассмотри возможность зарегистрироваться, чтобы стать участником Medium и поддержать мою работу. Всего за 5 долларов в месяц вы получаете неограниченный доступ к Medium.