Для интеграции с базами данных 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