SQLite ATTACH: подключить вторую базу к запросу

Категория: Postgresql · Язык: SQL · Обновлено:

ATTACH DATABASE подключает второй файл SQLite к текущему соединению. Таблицы становятся доступны по имени схемы, например archive.orders, и их можно соединять с main в одном SELECT. Присоединение действует только в этом соединении и не сохраняется в файле базы.

Соединить основную и архивную базу

SQL
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.