🐍 Самоучитель по Python для начинающих. Часть 22: Основы работы с SQLite
Разберем основные запросы к базе данных SQLite и обсудим альтернативу реляционным СУБД – модули dbm, pickle и shelves. В конце статьи – решения 10 практических задач, связанных с выборкой данных по различным критериям, редактированием записей и удалением дубликатов.
Python может работать со всеми распространенными СУБД (системами управления базами данных):
Реляционными (SQL)
Нереляционными (NoSQL)
Объектно-ориентированными
Объектно-реляционными
Резидентными
Столбцовыми
Ключ-значение
В этой статье мы будем изучать приемы работы с реляционной СУБД SQLite, которая поставляется с Python. Еще мы рассмотрим базы типа «ключ-значение», которые отлично подходят для хранения данных в простых приложениях.
Что такое SQL, СУБД, SQLite и ORM
SQL (Structured Query Language) – это специальный язык запросов, который используется для создания, изменения и выборки данных в реляционных базах данных, управляемых определенной СУБД.
Система управления базами данных (СУБД) – это программное обеспечение, которое позволяет сохранять, организовывать, изменять, получать и анализировать данные. Обычно СУБД выполняют следующие функции:
Создание и управление структурой данных (таблицы, индексы, ограничения и т.д.)
Обеспечение сохранности и целостности данных (транзакции, резервное копирование, восстановление).
Обеспечение доступности и безопасности данных (права доступа, шифрование и т.д.)
Реляционные СУБД используют язык SQL для выполнения запросов к данным и управления ими. Данные в реляционных базах хранятся в виде таблиц: каждая строка представляет собой отдельную запись, а каждый столбец – отдельное поле данных.
Надо заметить, что язык SQL – не единственный способ создавать запросы к базе данных: при создании веб-приложений на базе фреймворков Django и Flask разработчики обычно используют ORM.
ORM (объектно-реляционное отображение) – это своеобразная прослойка, которая позволяет программистам работать с данными в реляционных базах данных как с объектами Python. ORM использует язык SQL под капотом, но разработчикам не нужно его знать – таблицы в базах данных создаются автоматически, а запросы имеют очень простой и понятный синтаксис. Самые популярные прослойки – Django ORM и SQLAlchemy (для Flask).
SQLite – компактная, быстрая, универсальная СУБД. Хранит данные в локальном файле, не требует отдельного сервера для выполнения запросов или управления данными: вместо этого она использует библиотеку, которая работает внутри приложения. SQLite можно использовать для мобильных, настольных и веб-приложений.
Этот код создает базу данных с названием example. База включает в себя таблицу users, которая содержит поля id, name и age:
INTEGER означает, что в поле хранятся целочисленные значения.
PRIMARY KEY указывает на то, что это поле будет использоваться в качестве первичного ключа таблицы. Первичный ключ – это уникальный идентификатор, который используется для создания связи между таблицами в базе данных.
TEXT – класс данных, который используется для хранения строковых значений. Например, имя пользователя, почтовый адрес или наименование товара могут храниться в поле типа TEXT.
Помимо TEXT и INTEGER SQLite имеет следующие классы для хранения данных:
NULL – представляет нулевое значение.
REAL – используется для хранения чисел с плавающей точкой.
BLOB – применяется для хранения бинарных объектов (изображений, аудио или видео). На практике мультимедийные файлы очень редко хранят в БД – целесообразнее хранить там только ссылки на объекты.
В SQLite не предусмотрены отдельные типы данных для хранения даты и времени, но можно использовать тип данных TEXT для хранения даты и времени в виде строки в формате ISO-8601.
Некоторые другие типы данных при необходимости можно преобразовать в классы данных SQLite. К примеру, для хранения BOOLEAN значений можно использовать INTEGER, присваивая записи значения 0 или 1.
Добавление столбцов в таблицу
В предыдущем примере мы создали таблицу users, в которой хранятся имена и возраст пользователей. Добавим два новых поля – для хранения фамилии и названия факультета:
Как узнать, что находится в базе данных
Есть два способа посмотреть, что записано в БД:
Выполнить специальный запрос к системной таблице sqlite_master.
Воспользоваться визуальным браузером/редактором.
Начнем с первого способа – напишем и выполним запрос, чтобы узнать, какие поля (столбцы) есть в таблице:
Результат:
Второй способ проще и удобнее – можно сразу увидеть и структуру, и содержимое БД. Нам понадобится любой визуальный редактор, поддерживающий SQLite. Самый минималистичный вариант –sqlite-gui:
Из многофункциональных инструментов для работы с SQLite отлично подходит базовая версияDbeaver.
Добавление записей в БД
Внесем в базу первую запись – информацию о пользователе по имени Инна Егорова, 20 лет, с факультета прикладной математики:
Результат:
Редактирование записей
Изменим возраст для пользователя с именем Инна и фамилией Егорова:
Результат:
Удаление записей
Напишем запрос на удаление из БД всех записей, которые содержат «Прикладная математика» в поле faculty:
Поскольку в БД была всего одна запись, и она соответствовала критерию, после выполнения запроса база опустела:
Запросы на извлечение данных из нескольких таблиц
В реальных приложениях очень часто необходимо извлекать данные из нескольких таблиц сразу. Проиллюстрируем на примере базы данных university, в которой содержатся две таблицы – students и fees. Размер оплаты за обучение (fee) снижается на 3% каждый год. Кроме того, студенты, у который средний балл успеваемости соответствует установленному критерию, могут рассчитывать на дополнительную скидку.
Создадим базу и таблицы:
Заполним таблицы данными:
Чтобы выполнить запрос одновременно к таблицам students и fees, нам потребуется оператор JOIN:
Пример ввода:
Результат:
Альтернатива реляционной базе данных
SQL-запросы выглядят сложно (и это мы еще не рассматривали создание таблиц, связанных отношениями one to many, many to many и т.д., и написание запросов к ним!) Фреймворки Django и Flask со своими ORM, как уже упоминалось, максимально упрощают создание таблиц и выполнение запросов. А в обычном настольном Python-приложении часто можно обойтись простейшими базами типа «ключ-значение»: с ними можно работать, как с обычными словарями. Самые популярные модули, которые предоставляют интерфейс доступа к таким базам – dbm, pickle и shelves.
dbm входит в стандартную библиотеку Python. Представляет собой обертку для баз данных, которые функционируют как словари (со строковыми ключами и значениями). Такие базы можно использовать для хранения данных в простых приложениях:
pickle – модуль для сериализации и десериализации данных. С
его помощью тоже можно создать и использовать в приложении базу данных типа
«ключ-значение»:
shelve – обертка для pickle, позволяет создавать и извлекать
словари Python из файлов на диске с помощью ключей:
Создадим и заполним базу с помощью скрипта. Код для поиска всех препаратов, названия которых совпадают с запросом, выглядит так:
Задание 4
Напишите две программы:
Первая создает базу данных clothing и таблицу t-shirts в ней. В таблице должны быть поля: бренд, размер, цена, цвет. Скрипт заполняет таблицу данными о 20 футболках.
Вторая выбирает из таблицы футболки размера L, стоимостью до $100, не красного цвета.
Студенты группыb32 прогуливали занятия и плохо сдали экзамен по математике –
почти все получили оценки 2 и 3. Один из студентов решил взломать
университетскую базу данных и добавить по 1 баллу себе и одногруппникам.
Напишите программу, которая вернет настоящие оценки. База с оценками выглядит так, она создана при помощи этого
скрипта.
Имеется база данных retailcompany, созданная при помощи
этого скрипта. Каждый день, кроме выходных, сотрудники используют CRM. Время входа и выхода за
июнь 2023 регистрируется в таблице workload_june.
Напишите программу, которая определяет, сколько времени
суммарно каждый сотрудник провел в CRMв июне. Нужно вывести список
сотрудников, которые провели в CRMболее 95 часов.
Имеется база данных sales, созданная с помощью этого скрипта. В базе содержится
таблица cars. Дилер по
ошибке внес в таблицу дублирующие записи: они полностью повторяют существующие
данные, за исключением неверного регистра – названия марок и/или моделей в них
всегда начинаются со строчных букв:
Напишите программу, которая:
Находит и выводит список записей, у которых есть дубликаты.
Предлагает удалить дубликаты, и в случае ответа yes – удаляет их.
Мы научились выполнять основные операции с базой данных SQLite:
создавать, редактировать и удалять записи;
заполнять базу данными с помощью pandas;
делать выборки данных по различным критериям;
извлекать данные для последующих расчетов;
удалять дубликаты записей.
Работа с базами данных – обширная тема, и ее невозможно
подробно рассмотреть в одной статье. За кадром осталось многое, в том числе
работа с таблицами, связанными отношениями один к одному, один ко многим,
многие ко многим и многие к одному. Эту тему мы подробно разберем в новом курсе по Django.