1. Введение в модуль sqlite3: подключение к базе данных и создание курсора
Введение в модуль sqlite3: подключение к базе данных и создание курсора
Добро пожаловать в курс «Python и SQLite: Основы работы с базами данных». Это первая статья нашего цикла, и мы начнем с самого фундамента. Прежде чем строить сложные архитектуры и писать запутанные запросы, нам нужно научиться простому действию: открывать дверь в хранилище данных.
В программировании данные — это всё. Переменные в оперативной памяти живут лишь до тех пор, пока работает ваша программа. Но что делать, если вы хотите сохранить список пользователей, историю заказов или результаты игры после перезагрузки компьютера? Здесь на сцену выходят базы данных.
Почему именно SQLite?
В мире существует множество систем управления базами данных (СУБД): PostgreSQL, MySQL, Oracle, Microsoft SQL Server. Они мощные, но требуют установки отдельного сервера, настройки прав доступа и администрирования.
SQLite стоит особняком. Это встраиваемая реляционная база данных. Слово «встраиваемая» означает, что движок базы данных не является отдельным процессом, с которым программа общается через сеть. Библиотека SQLite компонуется непосредственно с вашей программой.
Главные преимущества для Python-разработчика:
.db или .sqlite).sqlite3 «из коробки». Вам не нужно делать pip install.Начало работы: импорт модуля
Поскольку поддержка SQLite встроена в Python, первый шаг всегда одинаков и предельно прост. Нам нужно импортировать модуль sqlite3.
Запустив этот код, вы увидите версии установленного программного обеспечения. Это подтверждает, что ваша среда готова к работе.
Подключение к базе данных
Чтобы начать работу с базой данных, нужно создать объект соединения (Connection). Этот объект представляет собой канал связи между вашей программой и файлом базы данных.
Для этого используется функция connect().
Что происходит в этот момент?
Когда вы вызываете sqlite3.connect('my_database.db'), происходит одно из двух событий:
Это очень удобно для начала новых проектов. Вам не нужно предварительно создавать файл вручную.
> Важно: Если вы хотите создать базу данных в конкретной папке, вы можете указать полный или относительный путь, например: sqlite3.connect('data/app_data.db').
База данных в оперативной памяти
Иногда вам не нужно сохранять данные на диск. Например, вы пишете тесты для своего приложения или хотите поэкспериментировать, не засоряя жесткий диск файлами. В таком случае можно создать базу данных прямо в оперативной памяти (RAM).
Для этого вместо имени файла используется специальное слово ':memory:'.
Такая база данных исчезнет бесследно, как только ваша программа завершит работу или соединение будет закрыто.
Курсор: ваш главный инструмент
Само по себе соединение (connection) не умеет выполнять SQL-запросы. Оно лишь держит канал связи открытым. Чтобы отдавать команды базе данных (создавать таблицы, добавлять данные, делать выборки), нам нужен курсор (Cursor).
Представьте, что база данных — это огромный склад. Объект соединения — это открытые ворота склада. А курсор — это кладовщик, который ходит по складу, находит нужные полки, кладет туда товары или забирает их по вашему списку.
Создается курсор методом cursor() объекта соединения:
Теперь у нас есть переменная cursor, через которую мы будем выполнять все SQL-команды.
Выполнение простейшего запроса
Давайте попробуем заставить нашего «кладовщика» сделать что-то полезное. Пока мы не умеем создавать таблицы (этому будет посвящена следующая статья), но мы можем попросить базу данных сообщить нам какую-нибудь системную информацию.
Для выполнения SQL-команд используется метод execute().
Разберем этот пример:
cursor.execute(...) — отправляет SQL-запрос в базу данных. В данном случае мы просим базу вернуть строку "Привет, SQLite!".cursor.fetchone() — извлекает одну запись из результата запроса. Обратите внимание, что результат возвращается в виде кортежа (tuple).Закрытие соединения
Работа с базами данных требует аккуратности. Когда вы открываете файл или соединение с базой, вы занимаете ресурсы операционной системы. Если ваша программа будет постоянно открывать новые соединения и не закрывать старые, это может привести к утечке памяти или блокировке файла базы данных (особенно в Windows).
Поэтому золотое правило: поработал — убери за собой.
После закрытия соединения любые попытки обратиться к базе данных через объект connection или cursor вызовут ошибку ProgrammingError.
Безопасная работа: конструкция try-finally
В реальной жизни программы часто падают с ошибками. Если ошибка произойдет между открытием соединения и его закрытием, строка connection.close() может никогда не выполниться. Файл останется заблокированным.
Чтобы этого избежать, используют блок try-finally:
Использование контекстного менеджера (with)
Python предлагает еще более элегантный способ работы с ресурсами — контекстные менеджеры (оператор with). Однако с sqlite3 есть нюанс.
Оператор with sqlite3.connect(...) as conn: автоматически не закрывает соединение в конце блока (в старых версиях и по умолчанию). Он предназначен для управления транзакциями (автоматический commit или rollback), о чем мы поговорим в будущих уроках.
Тем не менее, начиная с Python 3.11 и новее, поведение становится более интуитивным, но для полной надежности и совместимости с любыми версиями Python, часто рекомендуется использовать явное закрытие или специальные обертки.
Для новичка самым надежным и понятным способом на данном этапе будет использование try...finally или явный вызов close() в конце простого скрипта.
Резюме
В этом уроке мы сделали первые шаги в мир баз данных с Python:
sqlite3.connect(), создавая файл на диске или в оперативной памяти (:memory:).cursor) как исполнителя команд.execute() и получили данные через fetchone().close().Теперь, когда у нас есть открытый канал связи, мы готовы к наполнению нашей базы данных. В следующей статье мы научимся создавать таблицы и определять структуру наших данных.
Готовы двигаться дальше? Но сначала закрепим материал небольшими заданиями.