TypeORM NestJS迁移中deleted_at字段不存在报错的解决方法
问题原因
你的InfluencerAccount实体配置了@DeleteDateColumn()软删除字段,TypeORM的QueryBuilder会自动为启用软删除的实体附加AND ("influencer"."deleted_at" IS NULL)过滤条件。但在执行该查询的迁移步骤中,deleted_at字段还未被创建(添加字段的迁移还没执行到),因此触发了字段不存在的错误。
解决方案
1. 调整迁移执行顺序
TypeORM按迁移文件的时间戳前缀顺序执行,确保添加deleted_at字段的迁移文件时间戳早于执行查询的迁移文件。修改后者的文件名前缀(时间戳),让它在添加字段的迁移之后执行,这样查询时字段已经存在。
2. 临时禁用软删除自动过滤
如果无法调整迁移顺序,在QueryBuilder中显式关闭软删除的自动过滤逻辑:
const influencers = await queryRunner.manager.createQueryBuilder() .from(InfluencerAccount, 'influencer') .select(['influencer.id', 'influencer.email']) .where({ providerId: IsNull() }) .disableSoftDelete() // 关闭自动软删除过滤 .getMany()
也可根据需求使用withDeleted()(会返回所有记录,包括已软删除的)。
3. 改用原生SQL查询
绕开TypeORM实体的自动过滤规则,直接执行原生SQL查询:
const influencers = await queryRunner.query(` SELECT "id", "email" FROM "influencer_accounts" WHERE "providerId" IS NULL `);
内容的提问来源于stack exchange,提问作者Harsh Makadiya
相关产品推荐
相关产品推荐

