Запрос SELECT * FROM sqlite_master — первое, что вводит разработчик, когда нужно узнать, какие таблицы, индексы и триггеры существуют в файле базы SQLite, не открывая сторонних менеджеров. Эта таблица создаётся автоматически в каждой базе данных и хранит полное описание её схемы: имена объектов, типы и даже исходный SQL-код, которым они были созданы.
Ниже разберём, что именно содержит sqlite_master, как устроены её столбцы, чем она отличается от sqlite_schema и какие запросы чаще всего нужны на практике — от получения списка таблиц до поиска определения конкретного индекса.
Что такое sqlite_master простыми словами
sqlite_master — это системная (служебная) таблица, которую SQLite автоматически создаёт в каждой базе данных. Она выполняет роль каталога схемы: любой объект, созданный командами CREATE TABLE, CREATE INDEX, CREATE VIEW или CREATE TRIGGER, получает здесь свою запись.
Удалить или изменить эту таблицу напрямую через обычные INSERT, UPDATE или DELETE нельзя — SQLite блокирует такие операции. Содержимое меняется только косвенно: когда вы создаёте, изменяете или удаляете объекты базы данных.
По сути, это «паспорт» файла базы. Если открыть любой .db или .sqlite файл и выполнить запрос к sqlite_master, вы увидите всю структуру базы даже без доступа к самим данным пользовательских таблиц.
Структура таблицы: столбцы и их назначение
Таблица имеет фиксированный набор из пяти столбцов. Понимание каждого из них избавляет от лишних запросов к документации.
| Столбец | Что содержит | Пример значения |
|---|---|---|
type | Тип объекта: table, index, view, trigger | table |
name | Имя объекта | users |
tbl_name | Таблица, к которой относится объект | users |
rootpage | Номер корневой страницы B-дерева в файле | 2 |
sql | Исходный текст SQL-команды CREATE | CREATE TABLE users (...) |
Наиболее ценный на практике столбец — sql. В нём хранится дословный текст команды, которой объект был создан. Это позволяет восстановить схему любой таблицы, даже если исходные скрипты миграций утеряны.
Столбец rootpage нужен в основном для внутреннего устройства SQLite и инструментов анализа файла базы — в повседневной разработке его используют редко.
Как посмотреть содержимое sqlite_master
Проще всего работать через консольную утилиту sqlite3. Откройте базу и выполните запрос:
SELECT type, name, tbl_name FROM sqlite_master;
Для получения полного SQL-определения конкретной таблицы запрос выглядит так:
SELECT sql FROM sqlite_master WHERE name = 'users';
☑️ Базовые операции со схемой через sqlite_master
В графических инструментах вроде DB Browser for SQLite или DBeaver та же информация отображается в дереве объектов, но прямой запрос к sqlite_master удобнее, когда проверку нужно выполнить из кода приложения.
⚠️ Внимание: запросы вида DROP TABLE sqlite_master или попытки обновить её строки завершатся ошибкой. Не пытайтесь «починить» схему прямой правкой системной таблицы — изменяйте объекты только через стандартные команды CREATE, ALTER и DROP.
Практические примеры запросов
Несколько типовых задач, которые решаются через эту таблицу:
- 📋 Получить список всех пользовательских таблиц:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'; - 🔍 Проверить существование таблицы перед созданием — полезно в скриптах миграций.
- 🧩 Найти все индексы конкретной таблицы: фильтр по
type = 'index'иtbl_name. - ⚙️ Выгрузить полную схему базы: выбрать все непустые значения столбца
sql. - 🎯 Найти триггеры, привязанные к таблице, по сочетанию
type = 'trigger'иtbl_name.
Важный нюанс: внутренние объекты SQLite (например, sqlite_sequence, появляющаяся при использовании AUTOINCREMENT) тоже попадают в выборку. Фильтр name NOT LIKE 'sqlite_%' отсекает их.
sqlite_master и sqlite_schema: в чём разница
Начиная с версии SQLite 3.33.0, доступен альтернативный псевдоним — sqlite_schema. Это та же самая таблица, просто с более корректным именем: слово «master» исторически вводило в заблуждение, будто речь о главной копии базы.
Оба имени взаимозаменяемы в запросах. Старое имя сохранено ради обратной совместимости и будет поддерживаться, так как его использует огромное количество существующего кода. В новых проектах официальная документация рекомендует писать sqlite_schema, но запросы с sqlite_master продолжат работать.
Типичные ошибки и нюансы
Разработчики, впервые столкнувшиеся с системной таблицей, регулярно наступают на одни и те же грабли.
- 🚫 Попытка редактировать sqlite_master напрямую — операция запрещена движком.
- ❓ Пустой столбец
sqlу автоиндексов — это нормально, а не повреждение базы. - 🔁 Ожидание, что
ALTER TABLE RENAMEперепишет текст вsql— SQLite обновляет определение, но детали зависят от версии движка; проверяйте результат запросом. - 🗂 Путаница между
nameиtbl_name: для индекса name — имя самого индекса, а tbl_name — таблица, к которой он привязан.
⚠️ Внимание: если запрос к sqlite_master возвращает ошибку «database disk image is malformed», возможна порча файла базы. Не выполняйте дальнейших записей в базу — сначала сделайте копию файла и проверьте целостность командой PRAGMA integrity_check;.
Почему у некоторых строк пустой столбец sql
Индексы, которые SQLite создаёт автоматически для ограничений PRIMARY KEY и UNIQUE, не имеют пользовательской команды CREATE INDEX. Поэтому для них в столбце sql хранится NULL. Это штатное поведение, а не признак ошибки.
Когда sqlite_master действительно нужен
В обычном приложении обращаться к системной таблице приходится нечасто — ORM-библиотеки делают это за вас. Но есть сценарии, где без неё не обойтись: написание собственных миграций, инструменты сравнения схем, утилиты бэкапа структуры, отладка «базы неизвестного происхождения», полученной без документации.
Также sqlite_master незаменим при анализе баз данных мобильных приложений: многие Android-программы хранят данные именно в SQLite-файлах, и первый шаг изучения такой базы — выгрузка её схемы.
Часто задаваемые вопросы
Можно ли удалить таблицу sqlite_master?
Нет. SQLite блокирует удаление и любую модификацию этой таблицы. Она существует, пока существует сам файл базы данных.
Чем sqlite_master отличается от sqlite_sequence?
sqlite_master хранит описание всех объектов схемы, а sqlite_sequence — служебная таблица, которая появляется только при использовании AUTOINCREMENT и хранит последние выданные значения счётчиков.
Как получить список всех таблиц базы одним запросом?
Выполните: SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'; — это вернёт только пользовательские таблицы без служебных.
Почему запрос к sqlite_master не показывает данные таблиц?
Потому что sqlite_master содержит только описание схемы (метаданные), а не сами записи. Данные хранятся в пользовательских таблицах, и читать их нужно отдельными запросами.
Работает ли sqlite_master во всех версиях SQLite?
Да, имя sqlite_master поддерживается во всех версиях движка. Псевдоним sqlite_schema доступен начиная с версии 3.33.0.