#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
решает проблему.