Проекты*

Создание универсального интерфейса для работы с базами данных

Работа призёра открытой городской научно-практической конференции «Инженеры будущего» по направлению «Инженеры» в секции «Информационные технологии, программирование, прикладная математика, социальный инжиниринг» среди работ учащихся 10–11 классов

Направление работы: Программирование
Авторы работы: Предуниверситарий НИЯУ МИФИ
Предметы: Информатика
Классы: 11 класс
Мероприятия: Открытая городская научно-практическая конференция «Инженеры будущего» по направлению «Инженеры» 2022 года

Актуальность

В начале работы с базами данных зачастую возникает вопрос выбора подхода к работе с ними «из кода». Наиболее распространёнными вариантами являются либо ORM-подход, либо простой вызов SQL-кода.

При разработке проекта была выбрана «золотая середина» – подход, который объединяет процедурное и объектно ориентированное программирование и позволяет начать работать с базами данных без каких-либо входных параметров.

Цель

Создать модуль на языке программирования Python для работы с SQL и NoSQL базами данных «прямо из кода».

Задачи

  1. Разработать специальную утилиту.
  2. Использовать модуль PyODBC для создания подключения и отправки запросов к СУБД.
  3. Разработать класс «коннектор», через который будут проходить запросы.
  4. При помощи библиотеки threading сохранить коннектор в отдельный поток.
  5. Создать функции/методы, которые бы обобщали язык SQL.
  6. Добавить типизацию функций и методов для повышения читаемости кода, что упростит дальнейшую разработку библиотеки.
  7. Создать docker-образы, с помощью которых будут происходить отладка и демонстрация модуля при использовании различных СУБД.
  8. Разработать консольную утилиту, которая будет самостоятельно поднимать docker-контейнеры, необходимые для отладки написанных программ.

Оснащение и оборудование, использованное при создании работы

  • Компьютер

Описание

Функциональное описание консольной утилиты.

  • Пользователь передаёт в консоль путь к разработанной программе.
  • Указывает, на какой СУБД отладить программу: локальной или удаленной.

В случае если пользователь хочет отладить программу на локальной СУБД:

  • Пользователь передаёт данные для входа в локальную СУБД.
  • Создаётся специальный docker-compose.yml файл.
  • Описывается два Docker-контейнера: один – для СУБД, второй – для запуска программы.
  • На основе docker-compose.yml запускается «сервис» из 2-х Docker-контейнеров.
  • Сначала в контейнере для СУБД задаются настройки для БД: имя БД, имя суперпользователя и пароль для входа.
  • В отдельном контейнере для запуска программы устанавливаются все необходимые зависимости для корректной работы программы (ODBC драйвера, python, доп. библиотеки).
  • Запускается программа пользователя.
  • Как только программа отработает, «сервис» завершает свою работу.
  • Вывод программы передаётся пользователю в консоль.

В случае если пользователь хочет отладить программу на удаленной СУБД:

  • Создаётся «Dockerfile».
  • В нём описывается необходимое ПО для корректной работы программы и путь к ней.
  • На основе «Dockerfile» создаётся и далее запускается Docker-контейнер.
  • В Docker-контейнере устанавливается описанное ранее ПО.
  • После установки запускается программа пользователя.
  • Docker-контейнер завершает свою работу.
  • Вывод программы передаётся пользователю в консоль.

Описание реализации

Язык реализации – Python.

Подключение к СУБД и отправка запросов происходит через библиотеку PyODBC.

Сохранение коннектора в поток было осуществлено через создание собственного класса, который наследуется от обычного потока библиотеки Threading.

Создание или взаимодействие с таблицами происходит через обращение к одному классу. Однако на деле при инициализации объекта этого класса происходит проверка на существование таблицы в базе данных и в зависимости от этого возвращается либо объект с методами для создания таблицы, либо с методами для непосредственной работы с ней.

Ошибки (исключения) реализованы с использованием стандартных средств языка.

Использован Docker для упрощения установки необходимых зависимостей для библиотеки.

Docker-compose позволил создать «многоконтейнерные» приложения для моделирования ситуаций, при которых база данных поднимается локально.

Помимо этого, во время разработки проекта было решено добавить функции для импорта данных из csv-файлов или excel-таблиц в базу данных. Для их реализации были использованы библиотеки xlrd и csv, которые позволяют считывать данные из файлов.

Был написан специальный парсер, который позволял узнать тип данных каждого столбца в файле. С учётом этого в базе данных создаётся таблица, у которой столбцы имеют соответствующие типы данных. Если таблица успешно создалась, то в неё начинают импортироваться непосредственно сами данные из файла.

Результаты работы/выводы

Разработана утилита, позволяющая

  • работать с базами данных PostgreSQL и MongoDB через ODBC-драйвер;
  • обрабатывать CRUD-операции, имитирующие поведение SQL-запросов;
  • создавать и работать с таблицами через сущность в коде;
  • получать данные в удобном для пользователя формате (кортеж, массив, словарь);
  • создать Docker-образ для демонстрации и тестирования библиотеки;
  • создать консольную утилиту, которую можно использовать для запуска скриптов, написанных с использованием данной библиотеки;
  • тестировать программы на локальной базе данных, причём база данных создаётся автоматически консольной утилитой.


Среднее время выполнения некоторых операций

●         0.08125 сек. – вставка данных в таблицу

●         0.29270 сек. – получение одной строки из таблицы

●         0.40041 сек. – изменение одной строки в таблице

●         0.38484 сек. – удаление строки из таблицы

●         1.52961 сек. – импорт .xlsx-файла с 11216 ячейками в базу данных

●         0.20087 сек. – импорт .csv-файла с 1280 значениями в базу данных

Перспективы использования результатов работы

Разрабатываемый проект ориентирован на широкий спектр людей и задач. Он подходит начинающим программистам, школьникам и студентам, backend-разработчикам и просто людям, которые хотят внедрить поддержку баз данных в свой уже существующий проект.