SQLite в Python: создание, управление и оптимизация баз данных
SQLite — это легкая встроенная база данных, которая хранит данные в одном файле и входит в стандартную библиотеку Python. Она не требует установки сервера, работает на всех операционных системах и поддерживает стандартные SQL-запросы. Ниже рассказываем, как начать работать с SQLite, создать первые таблицы и начать управлять данными.

- Начало работы с SQLite в Python
- Создание таблицы
- Работа с данными в SQLite
- Извлечение данных с помощью SQL-запросов
- Фильтрация данных — оператор WHERE
- Логические операторы AND и OR
- Сортировка данных — ORDER BY
- Ограничение количества строк — LIMIT
- Оптимизация запросов и управление производительностью
- Транзакции и управление данными
- Продвинутые техники работы с SQLite в Python
- Заключение
Начало работы с SQLite в Python
SQLite — это легкая база данных, которая хранится в одном файле и не требует установки отдельного сервера. Для работы с ней в Python используется встроенная библиотека sqlite3, которая включена в стандартную поставку Python начиная с версии 2.5 и доступна во всех современных версиях, включая Python 3.12 и 3.13.
Установка и настройка Python
Чтобы начать использовать SQLite:
Перейдите на официальный сайт python.org/downloads.
Скачайте и установите последнюю стабильную версию Python для вашей операционной системы.
При установке отметьте пункт Add Python to PATH, чтобы команда python была доступна в терминале.
Проверьте установку — в разных системах команды могут отличаться:

Если вы видите номер версии — Python установлен корректно.
Теперь можно проверить встроенную поддержку SQLite:
Команда выведет текущую версию встроенной SQLite.
Создание новой базы данных и подключение к существующей
Чтобы подключиться к базе данных, используйте функцию sqlite3.connect(). Если файл базы данных существует — соединение откроется, а если файла нет — SQLite создаст новый.
В этом примере файл my_database.db создается в текущей рабочей папке. Чтобы поместить базу в другое место — укажите полный путь, например:
После выполнения операций с базой не забудьте закрыть соединение:
Альтернатива — использовать контекстный менеджер, который сам закрывает соединение:

Создание таблицы
Теперь создадим простую таблицу users с тремя столбцами:
id — уникальный идентификатор (целое число с автонумерацией);
name — имя пользователя (текст);
age — возраст (целое число).
В этом примере AUTOINCREMENT гарантирует, что идентификаторы не будут переиспользоваться, а команда commit() записывает изменения в файл базы данных.
Основные типы данных в SQLite
SQLite поддерживает динамическую типизацию — при этом тип данных определяется значением, а не столбцом. Тем не менее, каждая колонка имеет тип привязки (type affinity), который определяет, как хранятся данные по умолчанию.
NULL
Используется, если данные отсутствуют.
Вставка пустого значения:
INTEGER
Хранит целые числа (до 8 байт, со знаком).
REAL
Хранит числа с плавающей точкой (десятичные значения).
TEXT
Хранит текстовые данные (строки любого размера, ограничены только памятью).
BLOB
Используется для хранения двоичных данных — изображений, файлов и т.п.
Создание таблицы с разными типами данных
Теперь создадим таблицу products, которая объединит все типы данных SQLite. Каждый столбец будет демонстрировать использование одного из типов: INTEGER, REAL, TEXT, BLOB.
Пример таблицы products:
Расшифровка столбцов:
product_id (INTEGER) — первичный ключ таблицы и идентификатор товара.
product_name (TEXT) — название товара.
price (REAL) — цена товара в виде чисел с плавающей точкой.
quantity (INTEGER) — количество товара на складе.
description (TEXT) — описание товара.
image (BLOB) — изображение товара в виде бинарного потока данных.
manufacture_date (TEXT) — дата производства товара в формате YYYY-MM-DD.
discontinued (INTEGER) — статус товара, доступность. Если позиция отсутствует на складе, в поле будет значение NULL.
В SQLite тип даты — это текст, поэтому формат лучше задавать явно (YYYY-MM-DD). Если нужно работать с датами как с числами, можно использовать Unix timestamp (INTEGER).
Добавление данных (INSERT)
Добавим несколько записей в таблицу:
После вставки данных вы получите такой результат:
product_id | product_name | price | quantity | description | image | manufacture_date | discontinued |
1 | Smartphone | 499.99 | 150 | Latest model with OLED display | (BLOB данных, изображение в бинарном формате) | 2023-03-01 | 0 |
2 | Laptop | 799.99 | 80 | High performance laptop for gaming | (BLOB данных, изображение в бинарном формате) | 2022-11-15 | 0 |
3 | Headphones | 149.99 | 200 | Noise-canceling over-ear headphones | (BLOB данных, изображение в бинарном формате) | 2023-01-10 | 0 |
Работа с данными в SQLite
Теперь разберем основные команды для управления содержимым таблиц.
Вставка данных — INSERT
Синтаксис:
Пример:
Можно добавить несколько строк за один запрос:
Обновление данных — UPDATE
Синтаксис:
Пример:
Обновит только строки, где name = 'Bob'. При этом без WHERE будут изменены все записи таблицы.
Удаление данных — DELETE
Синтаксис:
Пример:
Пример комплексной работы с таблицей employees:
1. Создаем таблицу.
2. Добавляем данные.
Теперь таблица employees выглядит так:
Id | Name | Age | Department |
1 | Alice | 28 | HR |
2 | Bob | 35 | IT |
3 | Charlie | 40 | Finance |
3. Обновляем данные.
После выполнения запроса таблица будет выглядеть так:
Id | Name | Age | Department |
1 | Alice | 28 | HR |
2 | Bob | 36 | IT |
3 | Charlie | 40 | Finance |
Возраст сотрудника Bob обновился до 36 лет. Предположим, что данные о сотруднике Charlie больше не нужны. Для удаления записи используется оператор DELETE:
После выполнения запроса таблица будет выглядеть так:
Id | Name | Age | Department |
1 | Alice | 28 | HR |
2 | Bob | 36 | IT |
Запись о Charlie удалилась из таблицы.
Извлечение данных с помощью SQL-запросов
В этом разделе разберем команды, которые позволяют извлекать данные из таблиц и фильтровать результаты по заданным условиям.
SELECT
Главная команда для выборок в SQL — это SELECT. Она используется для получения данных из таблицы и может возвращать как все столбцы, так и лишь определенные поля.
Синтаксис:
Пример — выбор всех данных:
Этот запрос извлекает все строки и столбцы из таблицы employees.
FROM
Ключевое слово FROM указывает, из какой таблицы нужно получить данные. Она всегда используется вместе с SELECT.
Пример — выбор отдельных столбцов:
Этот запрос вернет только имена и возраст сотрудников. Если в таблице есть больше столбцов (например, id, department), они в результат не попадут.
Фильтрация данных — оператор WHERE
Оператор WHERE задает условия фильтрации. Он позволяет выбрать только те строки, которые соответствуют заданному критерию.
Синтаксис:
Пример — сотрудники старше 30 лет:
Запрос вернет все строки, где значение age больше 30.
В SQLite можно использовать стандартные операторы сравнения: =, >, <, >=, <=, <> (не равно), BETWEEN, LIKE, IN.
Логические операторы AND и OR
Операторы AND и OR позволяют комбинировать несколько условий в одном запросе:
AND — оба условия должны быть истинными.
OR — хотя бы одно из условий должно быть истинным.
Пример с AND — сотрудники отдела IT старше 30 лет:
Пример с OR — сотрудники старше 30 лет или из отдела HR:
Оба примера корректны и дают предсказуемый результат в SQLite.
При комбинировании условий можно использовать скобки для управления приоритетом: WHERE (department = 'HR' OR department = 'IT') AND age > 25;.
Сортировка данных — ORDER BY
Оператор ORDER BY сортирует результаты запроса по возрастанию (ASC) или по убыванию (DESC).По умолчанию сортировка выполняется в порядке возрастания.
Синтаксис:
Пример — сортировка по возрасту (по возрастанию):
Пример — сортировка по убыванию:
Оба варианта рабочие.
Можно сортировать сразу по нескольким полям:
С помощью команды будет произведена сортировка по отделу, а внутри отдела — по возрасту (от старшего к младшему).
Ограничение количества строк — LIMIT
Оператор LIMIT позволяет получить только указанное количество строк из результата запроса. Особенно полезно при тестировании или постраничном отображении данных.
Синтаксис:
Пример — получить первых пять сотрудников:
SQLite вернет только первые пять записей из таблицы employees.
Можно добавить OFFSET, чтобы пропустить первые N строк:
Оптимизация запросов и управление производительностью
Когда таблицы становятся большими, а запросов много — важно, чтобы они выполнялись быстро и безопасно. В SQLite для этого используются индексы, которые ускоряют поиск, и транзакции — они гарантируют целостность данных.
Использование индексов
Индекс — это структура данных, которая позволяет SQLite быстро находить нужные записи по значениям одного или нескольких столбцов. Он похож на алфавитный указатель в книге: помогает искать быстрее, но требует места и обновляется при каждом изменении данных.
Когда стоит использовать индексы
Если таблица содержит действительно много записей — от тысячи и больше, для нее могут пригодиться запросы вида SELECT ... WHERE column = value, а также сортировка (ORDER BY) или связи по ключам.
Для примера создадим таблицу users и добавим индекс на столбец name:
Этот код создает таблицу users и индекс idx_name для ускоренного поиска по полю name. Параметр IF NOT EXISTS предотвращает ошибку, если индекс уже существует.
Добавление данных и использование индекса
Теперь добавим несколько строк и выполним поиск по индексу:
Чтобы проверить, что индекс реально используется, нужно ввести:
Если в выводе появится USING INDEX, значит SQLite применяет индекс при поиске.
Удаление индекса
Если индекс больше не нужен, его можно удалить командой:
Пример полного алгоритма — создание базы, таблицы, индекса, вставка данных, поиск и удаление индекса:
Этот код можно запускать целиком — он создает базу, индекс, выводит результат поиска и корректно закрывает соединение.
Транзакции и управление данными
В SQLite есть такое понятие, как транзакции. Это несколько операций, объединенных в один логический блок. Транзакции упрощают управление базами данных и гарантируют целостность информации.
Транзакции основаны на принципах ACID:
Atomicity (Атомарность). Транзакция выполняется полностью либо не выполняется вообще.
Consistency (Согласованность). После завершения транзакции база данных всегда находится в согласованном состоянии.
Isolation (Изоляция). Каждая транзакция выполняется независимо от других транзакций.
Durability (Долговечность). После завершения транзакции все изменения сохраняются в базе данных.
Пример транзакции:
Если оба запроса выполняются успешно — изменения фиксируются (COMMIT). Если хотя бы один запрос вызовет ошибку — SQLite откатит всё (ROLLBACK).
Ручное управление транзакциями в SQL
Можно управлять транзакциями прямо из SQL:
По умолчанию SQLite работает в автоматическом режиме транзакций (autocommit). Если вы не используете BEGIN, каждая команда фиксируется сразу.
Продвинутые техники работы с SQLite в Python
В этом разделе рассмотрим методы, которые открывают более широкие возможности для безопасной и эффективной работы с базой данных — подготовленные запросы, представления, триггеры и методы выборки данных.
Использование Prepared Statements
Prepared Statement — это предварительно скомпилированный SQL-шаблон, в который при выполнении можно подставлять разные значения. Это ускоряет работу с повторяющимися запросами и защищает от SQL-инъекций.
Пример использования:
Этот код безопасен и корректен. Использование ? вместо конкатенации строк предотвращает SQL-инъекции, а SQLite сам оптимизирует многократные вызовы одного запроса.
Работа с представлениями (Views)
Представления — это виртуальные таблицы, которые хранят результаты SQL-запросов. Они не содержат данные напрямую, а просто ссылаются на запрос, который их формирует.
Использование представлений помогает:
упростить сложные SQL-запросы;
повторно использовать одну выборку;
повысить читаемость и удобство.
Пример создания представления:
После этого можно обращаться к представлению, как к обычной таблице:
В SQLite представления используются только для чтения — вы не можете напрямую изменять данные через них. Для редактирования применяются реальные таблицы.
Работа с триггерами (Triggers)
Триггеры — это автоматические процедуры, которые выполняются при определенных событиях: например, при добавлении, обновлении или удалении данных. Они часто используются для логирования изменений или поддержания связей между таблицами.
Создадим таблицу logs и триггер, который будет записывать сообщение при добавлении нового пользователя.
Таблица для логов:
Триггер, срабатывающий после вставки данных в users:
Теперь при каждом INSERT в таблицу users в таблицу logs автоматически добавляется запись.
Также в SQLite триггеры могут быть связаны с событиями:
Обработка результатов запросов (методы fetch)
Извлекать записи из результатов выборки помогут команды fetchone(), fetchmany() и fetchall(). В таблице описано, как они работают.
Метод | Описание | Пример |
fetchone() | Возвращает следующую строку из результата. Если данных больше нет, команда возвращает None | row = cursor.fetchone() |
fetchmany(n) | Возвращает заданное число строк результата | rows = cursor.fetchmany(5) |
fetchall() | Возвращает все строки результата в виде списка кортежей | rows = cursor.fetchall() |
Пример использования fetch-методов:
Если данных в таблице нет — методы возвращают None или пустой список. Поэтому при работе с fetchone() полезно проверять результат:
Создание простого приложения (пример)
Давайте создадим простое консольное приложение для управления списком задач (To-Do List), которое демонстрирует все рассмотренные техники работы с SQLite в Python.
Сперва создайте базу данных:
Примените методы:
А теперь используйте базу и методы:
Интеграция SQLite с другими библиотеками
SQLite отлично сочетается с библиотекой Pandas, которая используется для анализа и обработки табличных данных в Python. Такой дуэт позволяет быстро извлекать данные из базы, анализировать их и при необходимости обратно обновлять таблицы.
Извлечение данных из SQLite в Pandas
Рассмотрим пример на таблице sales, где хранятся данные о продажах. Создадим таблицу, добавим записи, извлечем их через Pandas и выведем результат.
После запуска этого кода на экране появится таблица продаж в виде DataFrame Pandas:
id | product_name | amount | price |
1 | Product A | 10 | 15.5 |
2 | Product B | 5 | 25.0 |
3 | Product C | 8 | 15.5 |
4 | Product D | 3 | 40.0 |
Анализ данных с помощью Pandas
Теперь рассчитаем общую сумму продаж по каждому продукту.
Результат:
Product_name | Total_sales |
Product A | 279.5 |
Product B | 125.0 |
Product C | 120.0 |
Pandas позволяет выполнять агрегатные операции значительно проще, чем SQL, а результаты можно визуализировать, построить графики или выгрузить в Excel.
Обновление данных SQLite через Pandas
Теперь изменим данные в Pandas и обновим таблицу sales в базе данных. Увеличим количество проданных единиц для Product A на 5:
Теперь количество Product A увеличилось — изменения записаны обратно в базу. Этот подход сочетает простоту анализа в Pandas и надежность транзакций SQLite.
Заключение
SQLite в Python представляет собой оптимальное решение для работы со встраиваемыми базами данных, гармонично сочетая простоту освоения с широкими функциональными возможностями. Главная сила технологии заключается в ее универсальности — она работает «из коробки» на всех платформах без необходимости установки дополнительного серверного ПО, что делает SQLite идеальным инструментом для быстрой разработки прототипов, мобильных приложений и выполнения легких аналитических задач.
Для более сложных и высоконагруженных проектов стоит рассмотреть переход на управляемые базы данных, такие как Evolution Managed PostgreSQL®. Этот сервис предлагает нативную поддержку сложных SQL-запросов, встроенные механизмы репликации и профессиональное администрирование, обеспечивая надежную основу для масштабируемых приложений.
