Перейти к основному содержанию

Генерация миграций

Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

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

Автоматическая генерация создаёт новый файл миграции, записывая все SQL-запросы, необходимые для обновления БД. Если изменения не обнаружены, команда завершится с кодом 1.

Предположим, у вас есть сущность Post со столбцом title, и вы изменили название столбца с title на name.

Сгенерировать миграцию можно следующей командой:

typeorm migration:generate -d <path/to/datasource> <migration-name>

Аргумент -d должен указывать путь к файлу, где определён ваш экземпляр DataSource.

Дополнительно можно указать имя миграции через параметр --name

typeorm migration:generate -- -d <path/to/datasource> --name=<migration-name>

или использовать абсолютный путь:

typeorm migration:generate -d <path/to/datasource> <path/to/migrations>/<migration-name>

Если вы указали имя post-refactoring, будет создан файл {TIMESTAMP}-post-refactoring.ts с таким содержимым:

import { MigrationInterface, QueryRunner } from "typeorm"

export class PostRefactoringTIMESTAMP implements MigrationInterface {
async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "title" RENAME TO "name"`,
)
}

async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "name" RENAME TO "title"`,
)
}
}

Для генерации JavaScript вместо TypeScript используйте флаг o (--outputJs). Это полезно для проектов на чистом JavaScript, где не установлены дополнительные пакеты TypeScript. Эта команда создаст новый файл миграции {TIMESTAMP}-PostRefactoring.js со следующим содержимым:

/**
* @typedef {import('typeorm').MigrationInterface} MigrationInterface
* @typedef {import('typeorm').QueryRunner} QueryRunner
*/

/**
* @class
* @implements {MigrationInterface}
*/
module.exports = class PostRefactoringTIMESTAMP {
/**
* @param {QueryRunner} queryRunner
*/
async up(queryRunner) {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "title" RENAME TO "name"`,
)
}

/**
* @param {QueryRunner} queryRunner
*/
async down(queryRunner) {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "name" RENAME TO "title"`,
)
}
}

По умолчанию генерируется код JavaScript в формате CommonJS с помощью флага o (псевдоним для --outputJs), но вы также можете генерировать код ESM с помощью флага esm. Это полезно для проектов на JavaScript, использующих ESM:

/**
* @typedef {import('typeorm').MigrationInterface} MigrationInterface
* @typedef {import('typeorm').QueryRunner} QueryRunner
*/

/**
* @class
* @implements {MigrationInterface}
*/
export class PostRefactoringTIMESTAMP {
/**
* @param {QueryRunner} queryRunner
*/
async up(queryRunner) {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "title" RENAME TO "name"`,
)
}

/**
* @param {QueryRunner} queryRunner
*/
async down(queryRunner) {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "name" RENAME TO "title"`,
)
}
}

Как видите, вам не нужно самостоятельно писать запросы.

Основное правило: генерируйте миграции после каждого изменения моделей. Для многострочного форматирования SQL-запросов используйте флаг p (псевдоним --pretty).