Базы данных
August 18, 2026 · View on GitHub
SQLite и DuckDB — два формата, которые tuitab не просто читает. Таблицу, открытую из такого файла, можно править и записать обратно в тот же файл, причём tuitab покажет каждый стейтмент, который собирается выполнить, до того как выполнится хоть один.

Открыть таблицу
tuitab shop.sqlite
tuitab warehouse.duckdb
tuitab app.db # какой это движок, решает заголовок самого файла
Первый экран — содержимое самой базы: все таблицы и view с числом строк и
столбцов. Enter открывает выбранную, Esc / q возвращает назад. В заголовке
после этого стоит shop.sqlite :: orders, а рядом появляется [*], как только
что-то не сохранено.
View открывается только для чтения. Как и сам обзор: сохранение любого из них в
ту же базу отклоняется — This table or view is read-only; save to a different file instead.
Править
Работает всё то же, что и на обычном листе: e правит ячейку, ge задаёт одно
значение всем выделенным строкам, d удаляет выделенные строки, P вставляет
строки, o добавляет пустую, а O открывает форму,
проверяющую значения по типам столбцов. Столбцы принимают zi (вставить), zd
(удалить), ze (переименовать), t (сменить тип) и z + ← / → для
перестановки.
NULL видно и его можно ввести. Ячейка NULL показывается курсивным NULL, а
не пустотой, и \N, введённый в ячейку на листе базы данных, пишет настоящий
NULL. Пустая строка остаётся пустой строкой.
Записать обратно
Ctrl+S подставляет путь, откуда таблица пришла. Подтвердите его — и ничего ещё
не запишется: откроется попап с точным SQL:
┌ shop.sqlite → orders · 1 UPDATE ─────────────────────────┐
│ UPDATE "orders" SET "qty" = 12 WHERE "rowid" = 1 │
│ │
│ ↑↓ · PgUp/PgDn · g/G · Enter run · Esc cancel │
└──────────────────────────────────────────────────────────┘
Список листается ↑ ↓, PgUp / PgDn и g / G. Enter выполняет его
целиком одной транзакцией, Esc отменяет, и не происходит ничего. Остальная
база — другие таблицы, индексы, view, триггеры — не затрагивается в обоих
случаях.
Структурные изменения попадают в тот же список как ALTER TABLE:
ALTER TABLE "orders" DROP COLUMN "note", под заголовком SCHEMA.
Когда таблицу приходится пересобирать
Ни один из движков не умеет переставлять столбцы, а у SQLite нет ALTER COLUMN,
поэтому перестановка столбцов — и смена типа столбца на SQLite — означает, что
таблица будет удалена и создана заново, а строки скопированы. Попап говорит об
этом до подтверждения:
-- this table will be rebuilt: dropped and created again, with its rows copied
Пересборка воспроизводит имена столбцов, типы, NOT NULL, DEFAULT и первичный
ключ из одного столбца. Всё, что она не смогла бы перенести без потерь — CHECK,
UNIQUE, внешний ключ, collation, — это отказ, а не молчаливая потеря:
'orders' has to be rebuilt to do this, and tuitab will not rebuild it: ….
Сохраните в другой файл.
Сохранение в другой файл
Укажите в Ctrl+S другой .db — и tuitab сначала скопирует всю базу: все
таблицы, индексы, view и триггеры, — а затем применит ваши изменения к копии.
Оригинал остаётся ровно таким, каким был. Файл-назначение должен ещё не
существовать; существующий отклоняется: … already exists. Saving a database elsewhere writes a fresh copy of the whole file — remove it first or choose another name.
Производные листы добавляют таблицу, а не правят её
За сводной таблицей, результатом JOIN, таблицей частот или листом Describe не стоит никакой таблицы. Сохранение такого листа в базу спросит имя таблицы и создаст её; таблицы, уже лежащие в файле, не трогаются. Это же и способ положить результат рядом с данными, из которых он получен.
Собрать базу с нуля
Укажите tuitab на файл базы, которого нет, — откроется пустой лист, в заголовке
inventory.sqlite [new]:
tuitab inventory.sqlite
ziвставляет столбец и спрашивает имя; повторите для остальных.tзадаёт каждому тип — целое, дробное, дата, логический, валюта и так далее.oдобавляет пустую строку, либоOоткрывает форму, которая подписывает каждое поле типом столбца и не принимает значение, которое столбец не хранит.Ctrl+S, затем имя таблицы.
На диск ложится настоящая типизированная таблица: столбец Integer объявлен
INTEGER и хранит целые, NULL остаётся NULL. И для SQLite, и для DuckDB.
Смотрите также
- Начало работы — открытие файлов и форматы.
- Рецепты — правка, буфер обмена, экспорт.
- MCP-сервер — как дать ассистенту менять таблицу, за флагом и двухшаговым подтверждением.