Базы данных

August 18, 2026 · View on GitHub

🇬🇧 This page in English · ← Оглавление документации

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
  1. zi вставляет столбец и спрашивает имя; повторите для остальных.
  2. t задаёт каждому тип — целое, дробное, дата, логический, валюта и так далее.
  3. o добавляет пустую строку, либо O открывает форму, которая подписывает каждое поле типом столбца и не принимает значение, которое столбец не хранит.
  4. Ctrl+S, затем имя таблицы.

На диск ложится настоящая типизированная таблица: столбец Integer объявлен INTEGER и хранит целые, NULL остаётся NULL. И для SQLite, и для DuckDB.

Смотрите также

  • Начало работы — открытие файлов и форматы.
  • Рецепты — правка, буфер обмена, экспорт.
  • MCP-сервер — как дать ассистенту менять таблицу, за флагом и двухшаговым подтверждением.