You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:43:12