TypeORM单步迁移建表加数据报错QueryFailedError: relation "zipcode"不存在
问题根因
该报错不属于配置缺失问题,是迁移执行过程中混用了两个独立的数据库连接上下文导致的:
- TypeORM 执行迁移时会为每个迁移文件分配独立的
QueryRunner实例,默认在事务中执行迁移逻辑。你通过queryRunner.query创建的zipcode表此时处于当前事务的未提交状态,仅对当前QueryRunner持有的连接可见。 - 后续插入数据时你调用了
getConnection().createQueryBuilder(),该方法会从全局连接池获取另一个独立连接,无法读取到未提交事务中的表,因此触发表不存在报错。
解决方案
方案1(推荐):统一使用当前迁移的QueryRunner执行插入逻辑
将数据插入的逻辑改为使用当前迁移上下文的queryRunner操作,和建表语句使用同一个连接事务:
public async up(queryRunner: QueryRunner): Promise<void> { await queryRunner.query( `CREATE TABLE "zipcode" ( "id" SERIAL NOT NULL, "zipCode" character varying NOT NULL, "city" character varying NOT NULL, "state" character varying NOT NULL, "county" character varying, "country" character varying, PRIMARY KEY ("id"))` ); // 改为使用queryRunner的manager创建查询构建器 await queryRunner.manager .createQueryBuilder() .insert() .into("zipcode") .values([ { id: 1, zipCode: "501", // 其余数据省略 } ]) .execute(); }
也可以直接用queryRunner.query编写原生INSERT语句,和建表逻辑写法保持一致即可。
方案2(不推荐):关闭当前迁移的事务控制
如果你不需要事务保障,可以在迁移类中添加transaction = false属性,关闭迁移的事务包裹,建表操作执行后会立即对所有连接可见,但如果迁移执行中途报错无法回滚,会导致表结构不一致。
内容的提问来源于stack exchange,提问作者Kashif Abid
相关产品推荐
相关产品推荐

