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

NestJS+TypeORM测试时出现'geography类型不存在'错误排查

解决NestJS测试模块中TypeORM geography列报错问题

问题核心

在测试模块中启用dropSchema: true时,TypeORM自动安装PostGIS的逻辑滞后于schema同步操作,导致创建包含geography类型的表时抛出QueryFailedError: type "geography" does not exist错误。而生产/开发环境因数据库未被频繁重建,PostGIS已提前存在,所以运行正常。

解决方案

1. 在数据源初始化前手动安装PostGIS

通过临时连接数据库,先执行扩展安装操作,再初始化正式数据源,确保schema同步前PostGIS已就绪:

export const testingModule = (providers: Provider[]) => {
  return Test.createTestingModule({
    imports: [
      TypeOrmModule.forRootAsync({
        useFactory: () => ({
          type: 'postgres',
          url: getEnv('DATABASE_URL'),
          dropSchema: true,
          autoLoadEntities: true,
          synchronize: true,
          logging: false,
          namingStrategy: new SnakeNamingStrategy(),
          keepConnectionAlive: false,
        }),
        dataSourceFactory: async (options: DataSourceOptions) => {
          // 创建临时连接用于安装PostGIS
          const tempDataSource = new DataSource({
            ...options,
            entities: [], // 无需加载实体
            synchronize: false,
          });
          await tempDataSource.initialize();
          await tempDataSource.query('CREATE EXTENSION IF NOT EXISTS postgis;');
          await tempDataSource.destroy();

          // 初始化正式数据源
          const dataSource = new DataSource(options);
          await dataSource.initialize();
          return dataSource;
        },
      }),
      TypeOrmModule.forFeature([Location]),
      EventEmitterModule.forRoot(),
    ],
    providers,
  });
};

2. 确保测试数据库用户有权限

测试用的数据库用户需要具备创建扩展的权限,若没有则执行以下SQL授权:

GRANT CREATE EXTENSION TO your_test_database_user;

3. 禁用测试环境的dropSchema(可选)

如果测试不需要每次重建整个schema,可以将dropSchema改为false,改用migrations或者手动清理数据,避免每次都需要重新安装PostGIS。

原因说明

TypeORM自动安装PostGIS的逻辑是在实体元数据解析后触发,但测试环境中dropSchema: true会先删除数据库所有对象,随后立即执行synchronize创建表,此时PostGIS尚未被安装,因此抛出类型不存在的错误。通过提前手动安装扩展,就能规避这个时序问题。

内容的提问来源于stack exchange,提问作者Kelsey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:52:44