Аннотация
Белинская М.А., Кравец Т.Н. Обзор универсального средства работы с базами данных для фреймворка Flask.В статье рассматриваются веб-фреймворк Flask, который предназначен для разработки веб-приложений на языке программирования Python и SQLAlchemy – набор инструментов Python SQL, который дает разработчикам доступ к базе данных. Также описывается создание модели базы данных.
Введение
База данных – это инструмент для сбора и организации сведений. Они используются во многих сферах. Удобство использования баз данных связано с их быстродействием, простотой получения и обновления данных, независимостью структуры, стандартизацией, безопасностью данных, интегрированностью и с многопользовательским доступом.
Язык программирования Python имеет обширную стандартную библиотеку, что позволяет разрабатывать веб-приложения, с помощью веб-фреймфорка Flask, а также работать с базами данных, с помощью инструментов SQLAlchemy.
Flask
Flask – это веб-фреймворк, модуль Python, который позволяется легко разрабатывать веб-приложения [1].
Веб-фреймворк сам по себе представляет собой набор библиотек и модулей, которые позволяют разработчикам писать веб-приложения, не беспокоясь о низкоуровневых деталях, таких как протокол, управление протоколами и т.д. Flask основан на наборе инструментов Werkzeg WSGI и механизме шаблонов Jinja2.
Интерфейс шлюза веб-сервера (Web Server Gateway Interface, WSGI) использовался в качестве стандарта для разработки веб-приложений Python. WSGI — это спецификация общего интерфейса между веб-серверами и веб-приложениями.
Werkzeug – это набор инструментов WSGI, реализующий запросы, объекты ответов и служебные функции. Это позволяет построить на нем веб-фрейм. Фреймворк Flask использует Werkzeug в качестве одной из своих баз.
jinja2 – популярный механизм шаблонов для Python. Система веб-шаблонов объединяет шаблон с определенным источником данных для отображения динамической веб-страницы.
Flask-SQLAlchemy
SQLAlchemy – это набор инструментов SQL, обеспечивающий эффективный и высокопроизводительный доступ к реляционным базам данных. Он предоставляет способы взаимодействия с несколькими механизмами баз данных, такими как SQLite, MySQL и PostgreSQL.
Flask-SQLAlchemy – это расширение Flask, которое упрощает использование SQLAlchemy с Flask, предоставляя инструменты и методы для взаимодействия с базой данных в приложениях Flask через SQLAlchemy.
Flask-SQLAlchemy представлен в виде двух различных API. Основополагающая архитектура – SQLAlchemy Core, поверх неё SQLAlchemy ORM, поверх них Flask-SQLAlchemy [2].
SQLAlchemy Core – это основополагающая архитектура для SQLAlchemy как «инструментарий базы данных». Библиотека предоставляет инструменты для управления подключением к базе данных, взаимодействия с запросами и результатами к базе данных, а также для программного построения инструкций SQL.
SQLAlchemy ORM основывается на ядре, предоставляя дополнительные возможности объектно-реляционного сопоставления. ORM предоставляет дополнительный уровень конфигурации, позволяющий сопоставлять определенные пользователем классы Python с таблицами базы данных и другими конструкциями, а также механизм сохранения объектов, известный как сеанс. Затем он расширяет язык выражений SQL базового уровня, позволяя составлять SQL-запросы и вызывать их в терминах пользовательских объектов.
Настройка расширения Flask-SQLAlchemy
Единственной необходимой конфигурацией приложения Flask является ключ SQLALCHEMY_DATABASE_URL. Это строка подключения, которая сообщает SQLAlchemy, к какой базе данных подключиться [3].
Создается объект приложения Flask, загружается необходимая конфигурация, а затем инициализируется класс расширения SQLAlchemy с приложением.
На рисунке 1 представлено подключение библиотеки, создание объекта PDB.
Рисунок 1 – Подключение библиотеки и создание объекта PDB
Объект PDB делает доступными для удобства имена в sqlalchemy и sqlalchemy.orm, такие как PDB.Column. Модель сгенерирует имя таблицы путем преобразования имени класса CamelCase в snake_case.
На рисунке 2 представлено создание модели базы данных для хранения данных о пользователе.
Рисунок 2 – Создание модели базы данных для хранения данных пользователя
Таблица пользователей содержит столбцы с id пользователя, с именем, паролем, адресом электронной почты, статусом и уровнем доступа.
Помимо представленных типов данных (Text и Integer) возможны также следующие типы: Boolean, Date, Datetime, Float, Interval, Match Type, String и др. [4].
Подключение к базе данных
SQLAlchemy поддерживает все наиболее популярные системы баз данных: PostgreSQL, MySQL, MariaDB, SQLite, Oracle и Microsoft SQL Server. Кроме того, есть сторонние пакеты для SQLAlchemy, которые добавляют поддержку для менее распространенных систем, типа CockroachDB, Firebird, IBM DB2 и т.д.
Для начала взаимодействия с базой данных необходимо создать движок – объект класса Engine. Обычно он представляет глобальный объект, который создается в приложении один раз для всех взаимодействий с определенным сервером баз данных и который хранит все подключения в виде пула к этому серверу баз данных. Для создания движка применяется функция create_engine() (см. рис. 3).
Рисунок 3 – Функция create_engine()
В качестве обязательного параметра в функцию create_engine() передается адрес URL подключения в формате: dialect[+driver]://user:password@host/dbname[?key=value..].
Строка подключения складывается из следующих частей:
- dialect представляет название системы бд, например, mysql, oracle, postgresql, sqlite;
- driver указывает на драйвер (DBAPI), применяемый для подключения к базе данных, например, psycopg2, pyodbc, cx_oracle и т.д. (для одной и той же СУБД может быть доступно множество драйверов. Если драйвер явным образом не указывается, то применяется драйвер по умолчанию);
- user:password: имя и пароль пользователя для подключения к базе данных;
- host: адрес сервера базы данных;
- dbname: имя базы данных;
- key=value: пары ключ-значения, которые представляют дополнительные параметры для подключения.
На рисунке 4 представлены примеры подключения к разным СУБД.
Рисунок 4 – Примеры подключения к разным СУБД
Для отслеживания изменения в структуре базы данных по мере разработки используется расширение Flask-Migrate.
Flask-Migrate – это расширение, которое настраивает Alembic надлежащим образом для работы с вашим приложением. Пример приложения обработки миграции базы денных через Flask-Migrate представлен на рисунке 5.
Рисунок 5 – Пример приложения обработки миграции базы данных
Для работы с Flask-Migrate используются команды «flask db <название команды>». Для создания репозитория миграций используется команда «flask db init», она добавляет папку миграции в приложение.
С помощью команды «flask db migrate –m “Initial migration.”» можно создать первоначальную миграцию. Сценарий миграции необходимо проверять и редактировать, поскольку Alembic не всегда способен обнаруживать все изменения, которые вы вносите в свои модели. В частности, Alembic в настоящее время не может обнаружить изменения имен таблиц, столбцов или ограничений с анонимными именами. Для применения изменений, описанных сценарием миграции, к базе данных используется команда «flask db upgrade».
Используя команду «flask db --help» можно посмотреть все доступные команды.
Заключение
В данной статье был рассмотрен фрейморк для Python – Flask, который позволяет создавать веб-приложения. А также его расширение Flask-SQLAlchemy, позволяющее работать с базами данных в приложении. Описана настройка расширения Flask-SQLAlchemy. Описано создание модели базы данных сведений о пользователях.
Рассмотрено подключение базы данных и даны примеры подключения к разными СУБД. SQLAlchemy поддерживает большую часть популярных СУБД. И рассмотрено расширение Flask-Migrate, предназначенное для отслеживания изменений в структуре базы данных по мере разработки.
Список использованной литературы
- What is Flask Python [Электронный ресурс]/ - режим доступа: https://pythonbasics.org/what-is-flask-python/ (дата обращения 09.04.2023).
- SQLAlchemy Unified Tutorial [Электронный ресурс]/ - режим доступа: https://docs.sqlalchemy.org/en/20/tutorial/index.html (дата обращения 09.04.2023).
- Quick Start – Flask-SQLAlchemy Documentation (3.0.x) [Электронный ресурс]/ - режим доступа: https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/quickstart/ (дата обращения 09.04.2023).
- Column and Data Types - SQLAlchemy 1.3 Documentation ) [Электронный ресурс]/ - режим доступа: https://docs.sqlalchemy.org/en/13/core/type_basics.html#generic-types (дата обращения 15.04.2023).