Глава 22 · Веб-разработка с Python

SQLite: встраиваемая реляционная СУБД

SQLite — реляционная СУБД, работающая как библиотека внутри процесса приложения, без отдельного сервера.

СУБД — система управления базами данных: программное обеспечение, которое создаёт, хранит, обрабатывает запросы и управляет базами данных. SQLite — встраиваемая реляционная СУБД, реализованная в виде программной библиотеки. В отличие от PostgreSQL или MySQL, SQLite не требует отдельного процесса сервера базы данных: приложение обращается к библиотеке SQLite непосредственно, внутри собственного процесса.

При обычном файловом использовании содержимое базы SQLite хранится в одном основном файле. Во время работы SQLite может создавать дополнительные служебные файлы, например rollback journal или WAL. SQLite также поддерживает базу данных в оперативной памяти (:memory:), которая не сохраняется на диск вовсе — это удобно, например, для тестов (раздел 22.33).

Для работы с SQLite в Python используется модуль sqlite3, предоставляющий интерфейс DB-API 2.0. В обычных сборках CPython он доступен без установки отдельного пакета через pip, однако технически sqlite3 относится к опциональным модулям конкретной сборки интерпретатора и использует библиотеку SQLite, установленную в системе или собранную вместе с Python.

Обычная клиент-серверная СУБДSQLite
Отдельный процесс-серверДа, работает постоянноНет — работает внутри процесса приложения
Основное хранениеУправляется сервером базы данныхОсновной файл базы данных (возможны служебные файлы journal/WAL)
Настройка для стартаУстановить и запустить сервер, настроить доступНе требуется отдельная настройка сервера
Несколько серверов приложения пишут одновременноШтатный сценарийОграниченная поддержка одновременной записи
Где SQLite подходит особенно хорошо
SQLite — полноценный SQL-движок, которым пользуются и очень крупные приложения — как основное хранилище локальных данных или как часть более крупной системы. SQLite хорошо подходит для локальных приложений, обучения, прототипов, тестов (раздел 22.33) и многих небольших и средних развёртываний, где модели одновременного доступа SQLite достаточно. Клиент-серверную базу выбирают не потому, что SQLite чем-то хуже как движок, а когда нескольким серверам приложения нужно надёжно писать в одну базу параллельно — эту разницу подробнее рассматривает раздел 22.24.

Подключение и курсор

podklyuchenie.py
import sqlite3

baza = sqlite3.connect("zadachi.db")
baza.row_factory = sqlite3.Row   # доступ к столбцам по имени

kursor = baza.execute("SELECT id, title FROM tasks")
for stroka in kursor:
    print(stroka["id"], stroka["title"])

baza.close()

sqlite3.connect(...) открывает (или создаёт, если файла ещё нет) файл базы данных. row_factory = sqlite3.Row позволяет обращаться к столбцам результата по имени, а не только по числовому индексу — удобнее и надёжнее, особенно если порядок столбцов в запросе когда-нибудь изменится.

Отдельное подключение на каждый поток
По умолчанию одно соединение sqlite3.connect(...) нельзя без осторожности использовать сразу из нескольких потоков. Практичный способ организовать подключения во Flask-приложении — открывать соединение под каждый запрос и закрывать его сразу после — показывает раздел 22.29.

Официальная документация: SQLite, Python — модуль sqlite3.

Практика: подключение к SQLite через sqlite3
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →