Миграции в NestJS

Миграции в NestJS

Для интеграции с базами данных NestJS использует TypeORM.

Поскольку он написан на TypeScript, он хорошо интегрируется с платформой Nest, однако, на сегодняшний день, документация на сайте разработчика не соответствует текущей кодовой базе. Понять, как именно работать с миграциями не так-то просто, программистские форумы забиты подобными вопросами.

Механизмы миграций позволяют легко синхронизировать структуры сущностей со структурами таблиц в базе данных, очень удобно, когда это можно делать автоматически. Для работы с миграциями нам понадобится TypeORM, установленный глобально:

$ npm install -g typeorm

Этот пакет предоставляет нам CLI, позволяющий генерировать миграции из существующих сущностей, выполнять и откатывать их. Например, migration:create создает пустую миграцию, migration:generate - генерирует миграции на основе имеющихся сущностей, migration:run и migration:rever выполняет и откатывает миграции соответственно.

Для работы с базой данных посредством CLI требуется создать DataSource - экземпляр конфигурации для подключения к БД.

import { DataSource } from "typeorm"
const AppDataSource = new DataSource({
    type: 'mysql',
    host: 'localhost',
    port: 3306,
    username: 'bd_user',
    password: 'bd_password',
    database: 'bd_name',
    synchronize: false,
    entities: [
        __dirname + '/**/*.entity.js'
    ],
    migrationsTableName: "migrations",
    migrations: [
        __dirname + '/migrations/*.js'
    ]
});
export default AppDataSource;

Один маленький но очень важный момент. CLI typeorm не работает с файлами typescript. Попытка передать скрипту или загрузить в конфигурацию файл *.ts вызовет ошибку. Поэтому, будем передавать скрипту файлы *.js после компиляции. В коде выше __dirname указывает на каталог dist.


Итак, дополним раздел scripts нашего package.json такими строками:

...
"migration:make": "npm run build && typeorm migration:generate -d ./dist/data-source.js",
"migration:migrate": "npm run build && typeorm migration:run -d ./dist/data-source.js",
"migration:prev": "typeorm migration:revert -d ./dist/data-source.js"

Для автоматической генерации миграций будем использовать команду:

$ npm run migration:make <path/to/migrations_dir>/<migration_name>

где path/to/migrations_dir - путь к директории с миграциями, migration_name - название миграции. Я располагаю их обычно в ./src/migrations.

Далее, для запуска изменений в базе данных выполним следующую команду:

$ npm run migration:migrate

Если мы посмотрим в базу данных, мы увидим, что в таблицы были внесены изменения согласно соответствующим сущностям.

Для отката последней миграции нужно выполнить команду:

$ migration:prev