Картинка» работы Objection + Knex

*** «Картинка» работы Objection + Knex *** 1. **Класс-модель** *Вы описываете сущность* – задаёте `tableName`, при желании `jsonSchema` и связи. Модель знает, в какой таблице живут её строки и каким правилам должны соответствовать входящие данные. 2. **Привязка Knex** Один раз вызываете ` import Knex from 'knex'; import { Model } from 'objection'; const knex = Knex(config); // config из knexfile.js Model.knex(knex); `. С этого момента каждая модель получает методы `query()`, `insert()`, `update()` и т. д. 3. **Обращение к данным** Вы вызываете, например, `User.query().insert({...})`. Объект Objection строит цепочку действий и передаёт её во внутренний **Knex-QueryBuilder**. 4. **Генерация SQL** Knex превращает цепочку в готовый SQL-запрос, подходящий для вашей СУБД (PostgreSQL, SQLite, MySQL …). 5. **Выполнение запроса** Knex отправляет SQL драйверу базы, получает ответ и отдаёт его Objection-объекту. 6. **Результат** Objection мапит сырую строку (row) на экземпляр модели: вы получаете объект `User`, у которого сразу доступны методы `$query()`, `$relatedQuery()` и поля, приведённые к нужным типам. > Сама структура таблиц (типы колонок, индексы) ведётся **миграциями Knex**; `jsonSchema` модели служит только для валидации входных JS-объектов и не меняет БД. > При изменении схемы бд, создаем новый файл миграций npx knex migrate:make add_age_to_users, и пишем в ручную код изменения и отката бд.