Введение

Часть 8

Базы данных: сначала изучите состояние, потом записывайте

База данных кажется страшнее файла потому, что состояние скрыто за драйвером. Лекарство то же: подключиться к контролируемой цели, посмотреть структуру, увидеть данные, сделать одно ограниченное изменение и проверить результат.

База данных — ещё одна форма структурированного состояния

Файл показывает исходный текст напрямую. База данных показывает состояние через движок: таблицы или коллекции, записи, индексы и запросы. Не начинайте с записи. Сначала уточните драйвер и выбранную базу, затем изучите уже существующую структуру.

Здесь работает тот же принцип, что и с конфигурацией: обращайтесь к логическому объекту — таблице, строке, ключу или документу, — а не к тому, как данные физически хранятся.

`db` даёт общий словарь, но драйвер всё равно важен

db умеет выбрать установленный драйвер и зеркалит общие операции: подключение, список, просмотр структуры, предварительный просмотр, поиск, экспорт и точечные записи. Прямые команды sqlite, mysql, postgresql, redis, mongodb сохраняют специфику движка на виду.

Общий слой — это удобный словарь, а не утверждение, что все базы одинаковы. SQL-таблицы, ключи Redis и документы MongoDB имеют разные модели данных и собственные возможности.

install md db sqlite
db
db sqlite
sqlite

SQLite — самое безопасное место для первого знакомства с базами данных

SQLite хранит базу в одном локальном файле, поэтому идеально подходит для одноразового упражнения. Создайте data/notes.sqlite, затем одной SQL-командой, специфичной для SQLite, создайте простую таблицу. После этого -t должен показать её.

Здесь нет сети и учётных данных. Практическую базу потом можно удалить как обычный файл, поэтому это гораздо спокойнее, чем начинать обучение с рабочей MySQL-базы.

cd lil-playground
md data
sqlite -c data/notes.sqlite -f
sqlite : CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, title TEXT NOT NULL, status TEXT NOT NULL)
sqlite -t

Сначала структура, затем предварительный просмотр строк

sqlite -s notes показывает столбцы и типы. sqlite -n notes 10 показывает первые строки. Пустой ответ в новой таблице — тоже полезный факт: схема уже существует, а данные ещё не добавлены.

Сделайте этот порядок привычкой. Проверить поля до записи — для базы данных то же самое, что проверить путь назначения перед перемещением файла.

sqlite -s notes
sqlite -n notes 10

Для точечных записей можно передавать JSON, а не собирать SQL вручную

Для обычной вставки или обновления драйвер принимает JSON-объект после :. Значения остаются отдельно от синтаксиса команды, и ради простой строки не нужно вручную заключать в кавычки целый SQL-запрос.

После каждой записи снова делайте предварительный просмотр или поиск. -a добавляет, -w обновляет совпавшие строки, -d существует для осознанного удаления. Короткая команда удаления не должна становиться рефлексом.

sqlite -a notes : {"title":"First terminal note","status":"draft"}
sqlite -a notes : {"title":"Archive project","status":"done"}
sqlite -n notes 10
sqlite -w notes title "First terminal note" : {"status":"reviewed"}
sqlite -f notes reviewed 20

Собственный SQL базы нужен там, где общего интерфейса уже недостаточно

Группировка вроде SELECT status, COUNT(*) ... естественно выражается на SQL. Форма через : оставляет этот выход, не притворяясь, что компактные общие команды покрывают любую задачу базы данных.

Эта граница полезна: повседневные операции выполняйте короткими структурированными формами, а собственный язык базы используйте, когда задача действительно зависит от конкретной СУБД.

sqlite : SELECT status, COUNT(*) AS count FROM notes GROUP BY status

Экспорт отвечает на вопрос о данных, дамп сохраняет более целое состояние

Экспорт таблицы notes в JSON даёт переносимые строки для других инструментов. dump сохраняет схему и данные для восстановления. Это связанные, но разные артефакты — называйте и храните их соответственно.

Резервное копирование не закончено, пока вы не посмотрели результат и не понимаете, как его восстановить. Позже обязательно попробуйте восстановление в отдельную одноразовую базу, а не впервые во время аварии.

sqlite -o notes -j data/notes.json -f
sqlite dump data/notes.sql -f
stat data/notes.sql

Удалённая база требует учётных данных, прав доступа и рабочей сети

Подключение MySQL/MariaDB или PostgreSQL добавляет имя хоста, пользователя, базу данных, сетевой адрес и скрытый запрос пароля. У Redis и MongoDB свои модели. Именно поэтому мы начали с SQLite: привычки работы с базой можно освоить отдельно от сложности подключения.

Не вставляйте реальные пароли в переносимые сценарии или публичные примеры. Учётные данные должны вводиться через скрытый запрос пароля или храниться в специально предусмотренном защищённом хранилище, а записи в рабочую базу начинайте только после проверки выбранной базы и целевых строк.

SQLiteлокальный файлПрактика, встроенные данные, небольшое локальное состояние
MySQL / MariaDBудалённый SQLТипичные веб-приложения и хостинг
PostgreSQLудалённый SQLРеляционные приложения и более сложный SQL
Redisключи / значенияКеш и быстрое временное состояние
MongoDBдокументыДокументные данные приложений
db mysql
mysql -c localhost app shop
postgresql -c localhost app shop

Сохраните это как сценарий

Сохраните это как database-checkpoint.lil. Сценарий открывает одноразовую SQLite-базу, гарантирует наличие тренировочной таблицы, показывает её и создаёт дамп. Он намеренно не автоматизирует прикладные записи: повторяемая автоматизация базы должна начинаться с проверок и резервной копии.

#lil
@install md sqlite
cd lil-playground
md data
sqlite -c data/notes.sqlite -f
sqlite : CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, title TEXT NOT NULL, status TEXT NOT NULL)
sqlite -t
sqlite -n notes 10
sqlite dump data/notes.sql -f