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

Prisma+PostGIS迁移报错:找不到postgis.control文件(实际已存在)

问题描述

我在Ubuntu系统中尝试在Prisma中配置PostGIS,操作步骤如下:

  1. 在prisma.schema中添加模型:
model area{
  id                  Int      @id @default(autoincrement())

  geometry    Unsupported("geometry")
  @@index([geometry], name: "geometry_idx", type: Gist)

  created_at          DateTime @default(now()) @db.Timestamptz(6)
  updated_at          DateTime @default(now()) @db.Timestamptz(6)
}
  1. 创建并编辑迁移文件:
-- create postgis extension
CREATE EXTENSION postgis;

-- AlterTable
ALTER TABLE "area" DROP COLUMN "coordinates",
ADD COLUMN     "geometry" geometry NOT NULL;

-- CreateIndex
CREATE INDEX "geometry_idx" ON "area" USING GIST ("geometry");
  1. 执行命令prisma migrate dev --create-only时,出现错误:
Error: P3006

Migration `20220925201559_add_postgis_geometry` failed to apply cleanly to the shadow database. 
Error:
db error: ERROR: could not open extension control file "/usr/share/postgresql/13/extension/postgis.control": No such file or directory
   0: sql_migration_connector::validate_migrations
             at migration-engine/connectors/sql-migration-connector/src/lib.rs:272
   1: migration_core::state::DevDiagnostic
             at migration-engine/core/src/state.rs:250

已确认通过apt安装了postgis、postgresql-13和postgresql-13-postgis-3-scripts,本地能找到/usr/share/postgresql/13/extension/postgis.control文件,但影子数据库提示文件不存在。

可能的解决方案
  • 检查影子数据库的PostgreSQL版本
    Prisma默认创建的影子数据库可能使用了与本地主数据库不同的PostgreSQL版本,导致找不到对应版本的PostGIS扩展。可以通过以下方式排查:

    1. 查看Prisma日志,找到影子数据库的连接信息,连接后执行SELECT version();确认版本。
    2. 如果版本不一致,确保对应版本的PostGIS已安装,或者在Prisma配置中指定影子数据库使用主数据库的版本。
  • 手动指定影子数据库连接
    避免Prisma自动创建临时影子数据库,改用本地已配置好PostGIS的数据库实例:

    1. 在prisma.schema的datasource块中添加shadowDatabaseUrl:
    datasource db {
      provider = "postgresql"
      url      = env("DATABASE_URL")
      shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
    }
    
    1. 在.env文件中设置SHADOW_DATABASE_URL为一个已创建的空数据库(需确保该数据库所在的PostgreSQL实例已安装PostGIS)。
  • 验证影子数据库的扩展访问权限
    手动连接影子数据库,执行CREATE EXTENSION postgis;,查看具体报错:

    1. 如果提示权限问题,检查PostgreSQL服务用户(通常为postgres)对/usr/share/postgresql/13/extension/目录的读取权限,执行ls -l /usr/share/postgresql/13/extension/postgis.control确认权限设置。
    2. 如果是搜索路径问题,执行SHOW search_path;,确保extension在路径中,若不在则执行SET search_path TO "$user", public, extension;。
  • 重置影子数据库
    删除已存在的影子数据库(可从Prisma日志中获取数据库名称),然后重新执行迁移命令,让Prisma重新创建影子库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:10:19