TypeORM迁移无法删除列及字段类型未更新问题求助
TypeORM迁移异常问题
我有一个Test实体,其中的creatorId字段初始类型为integer,将其改为string并运行迁移后,数据库中该字段仍为int类型。于是我删除了creatorId字段并新增userId字段,再次运行迁移时,仅新增了userId列,却未删除creatorId列。
Test实体代码
@ObjectType() @Entity() export class Test extends BaseEntity { @Field() @PrimaryGeneratedColumn() id!: number; @Field(() => String) @Column() creatorId: string; // 问题字段 @ManyToOne(() => User, (user) => user.tests) creator: User; @Field() @Column() time: string; @Field() @Column() accuracy: string; @Field() @Column() wpm: number; @Field() @Column() chars: string; @Field(() => String) @CreateDateColumn() createdAt: Date; }
package.json中的scripts配置
"scripts": { "watch": "tsc -w", "dev": "nodemon dist/index.js", "start": "node dist/index.js", "typeorm": "ts-node ./node_modules/typeorm/cli", "migration:create": "typeorm migration:create ./src/migrations/migration", "migration:run": "ts-node ./node_modules/typeorm/cli --dataSource ./dist/data-source.js migration:run", "migration:generate": "ts-node ./node_modules/typeorm/cli --dataSource ./dist/data-source.js migration:generate ./src/migrations/migration", "migration:show": "ts-node ./node_modules/typeorm/cli --dataSource ./dist/data-source.js migration:show" },
data-source.ts代码
import { DataSource } from 'typeorm'; import dotenv from 'dotenv'; import { User } from './entities/user'; import { Test } from './entities/test'; dotenv.config(); export const AppDataSource = new DataSource({ type: 'postgres', host: 'localhost', port: 5432, database: 'type-io', username: process.env.DATABASE_USERNAME?.toString(), password: process.env.DATABASE_PASSWORD?.toString(), logging: true, synchronize: false, entities: [Test, User], migrations: [], cache: false, }); AppDataSource.initialize() .then(async () => { console.log('Data Source has been initialized!'); }) .catch((err) => { console.error('Error during Data Source initialization', err); });
注:data-source中migrations字段为空是因为只有导入迁移类才能生效,引用路径无法正常工作。
迁移示例(将userId改名为creatorId时生成)
import { MigrationInterface, QueryRunner } from "typeorm"; export class migration1680420345316 implements MigrationInterface { name = 'migration1680420345316' public async up(queryRunner: QueryRunner): Promise<void> { await queryRunner.query(`ALTER TABLE "test" DROP COLUMN "userId"`); await queryRunner.query(`ALTER TABLE "test" DROP CONSTRAINT "FK_ab6d476e7698322a3a35b5fdb12"`); await queryRunner.query(`ALTER TABLE "test" ALTER COLUMN "creatorId" SET NOT NULL`); await queryRunner.query(`ALTER TABLE "test" ADD CONSTRAINT "FK_ab6d476e7698322a3a35b5fdb12" FOREIGN KEY ("creatorId") REFERENCES "user"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); } public async down(queryRunner: QueryRunner): Promise<void> { await queryRunner.query(`ALTER TABLE "test" DROP CONSTRAINT "FK_ab6d476e7698322a3a35b5fdb12"`); await queryRunner.query(`ALTER TABLE "test" ALTER COLUMN "creatorId" DROP NOT NULL`); await queryRunner.query(`ALTER TABLE "test" ADD CONSTRAINT "FK_ab6d476e7698322a3a35b5fdb12" FOREIGN KEY ("creatorId") REFERENCES "user"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); await queryRunner.query(`ALTER TABLE "test" ADD "userId" character varying NOT NULL`); } }
我怀疑问题和TypeORM的实体元数据有关,清理元数据可能能解决,但不知道具体操作方法,求帮助。
内容的提问来源于stack exchange,提问作者Rohith Nambiar
相关产品推荐
相关产品推荐

