Миграция Typeorm не обнаруживает изменений должным образом

#typescript #postgresql #nestjs #typeorm

Вопрос:

Я использую typeorm в своем приложении nestjs, используя базу данных postgresql. Когда я пытаюсь создать миграцию для синхронизации своей базы данных для применения изменений приложений, в сгенерированном файле миграции всегда существует следующий запрос (я удалил некоторые ненужные запросы для дополнительной удобочитаемости).:

 export class portal1631976435381 implements MigrationInterface {
    name = 'portal1631976435381'

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`ALTER TABLE "organization" DROP COLUMN "isTransporter"`);
        await queryRunner.query(`ALTER TABLE "organization" DROP COLUMN "crmId"`);
        await queryRunner.query(`ALTER TABLE "organization" DROP COLUMN "telephoneNumber"`);
        await queryRunner.query(`ALTER TABLE "organization" ADD "crmId" character varying`);
        await queryRunner.query(`ALTER TABLE "organization" ADD "telephoneNumber" character varying`);
        await queryRunner.query(`ALTER TABLE "organization" ADD "isTransporter" boolean NOT NULL DEFAULT false`);
        await queryRunner.query(`CREATE VIEW "inventory_based_on_receipt_item_view" AS SELECT "ri"."id" AS "receiptItemId" from someTableC`);
        await queryRunner.query(`INSERT INTO "typeorm_metadata"("type", "schema", "name", "value") VALUES ($1, $2, $3, $4)`, ["VIEW","public","inventory_based_on_receipt_item_view",]);
        await queryRunner.query(`CREATE VIEW "inventory_based_on_receipt_item_view" AS SELECT "ri"."id" AS "receiptItemId" from someTableB`);
        await queryRunner.query(`INSERT INTO "typeorm_metadata"("type", "schema", "name", "value") VALUES ($1, $2, $3, $4)`, ["VIEW","public","inventory_based_on_receipt_item_view",]);
        await queryRunner.query(`CREATE VIEW "receipt_item_transaction_view" AS SELECT "ri"."id" AS "receiptItemId" from someTableA`)
        await queryRunner.query(`INSERT INTO "typeorm_metadata"("type", "schema", "name", "value") VALUES ($1, $2, $3, $4)`, ["VIEW","public",...]);
    }
    public async down(queryRunner: QueryRunner): Promise<void> { ... }
}
 

Независимо от того, какие изменения применяются к приложению, все объекты просмотра удаляются и создаются заново.

Другая проблема заключается в том, что inventory_based_on_receipt_item_view в запросе создается два раза с 2 немного разными запросами, хотя у меня есть только одно представление с таким именем (я действительно не знаю, откуда оно берется). Другая проблема заключается в том, что 3 столбца организационной таблицы ( crmId , telephoneNumber и isTransporter ) удаляются и воссоздаются с той же детализацией.

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

Ответ №1:

Я нашел проблему. При выполнении сценария миграции он создает файл ts миграции в папке миграции, но существуют предыдущие файлы миграции в папке dist. Таким образом, новый файл миграции добавляется к существующему файлу миграции в папке dist.

Удаление папки dist перед запуском migration:generate решает проблему.