SQLite ATTACH: подключить вторую базу к запросу
ATTACH DATABASE подключает второй файл SQLite к текущему соединению. Таблицы становятся доступны по имени схемы, например archive.orders, и их можно соединять с main в одном SELECT. Присоединение действует только в этом соединении и не сохраняется в файле базы.
Соединить основную и архивную базу
CREATE TABLE main.orders (
id INTEGER PRIMARY KEY,
total NUMERIC NOT NULL
);
INSERT INTO main.orders (id, total) VALUES (1, 1990.00), (2, 450.00);
ATTACH DATABASE 'archive.db' AS archive;
CREATE TABLE archive.orders (
id INTEGER PRIMARY KEY,
total NUMERIC NOT NULL
);
INSERT INTO archive.orders (id, total) VALUES (2, 450.00), (3, 1200.00);
SELECT m.id, m.total
FROM main.orders AS m
JOIN archive.orders AS a ON a.id = m.id
ORDER BY m.id;
DETACH DATABASE archive;main — основная база соединения, temp — временная, archive — присоединённая. Путь в ATTACH относителен рабочему каталогу процесса, а не файлу основной базы; для предсказуемости используйте абсолютный путь. DETACH освобождает файл, но завершится ошибкой, если в соединении остались активные выражения с этой схемой.
В режиме WAL транзакция, изменяющая несколько присоединённых баз, не является атомарной для всех файлов: каждая база пишет свой WAL. Если нужна общая атомарность, используйте journal_mode=DELETE или проектируйте операции так, чтобы они не зависели от одновременного коммита. Проверить режим можно через PRAGMA journal_mode;.
Не подключайте недоверенные файлы: схема может содержать триггеры и представления, которые повлияют на запросы, а старые версии SQLite имели уязвимости при разборе файлов. Для чтения используйте URI file:archive.db?mode=ro и отдельное соединение. ATTACH не заменяет резервное копирование: для копии используйте VACUUM INTO или .backup.
Лимит присоединённых баз задаётся SQLITE_MAX_ATTACHED (по умолчанию 10). Превышение даёт ошибку too many attached databases. Для временных данных удобно ATTACH ':memory:' AS scratch, но такая база исчезнет при закрытии соединения.
Документация: ATTACH DATABASE, DETACH.