Prisma+PostGIS迁移报错:找不到postgis.control文件(实际已存在)
问题描述
我在Ubuntu系统中尝试在Prisma中配置PostGIS,操作步骤如下:
- 在
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) }
- 创建并编辑迁移文件:
-- 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");
- 执行命令
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扩展。可以通过以下方式排查:- 查看Prisma日志,找到影子数据库的连接信息,连接后执行
SELECT version();确认版本。 - 如果版本不一致,确保对应版本的PostGIS已安装,或者在Prisma配置中指定影子数据库使用主数据库的版本。
- 查看Prisma日志,找到影子数据库的连接信息,连接后执行
手动指定影子数据库连接
避免Prisma自动创建临时影子数据库,改用本地已配置好PostGIS的数据库实例:- 在
prisma.schema的datasource块中添加shadowDatabaseUrl:
datasource db { provider = "postgresql" url = env("DATABASE_URL") shadowDatabaseUrl = env("SHADOW_DATABASE_URL") }- 在
.env文件中设置SHADOW_DATABASE_URL为一个已创建的空数据库(需确保该数据库所在的PostgreSQL实例已安装PostGIS)。
- 在
验证影子数据库的扩展访问权限
手动连接影子数据库,执行CREATE EXTENSION postgis;,查看具体报错:- 如果提示权限问题,检查PostgreSQL服务用户(通常为
postgres)对/usr/share/postgresql/13/extension/目录的读取权限,执行ls -l /usr/share/postgresql/13/extension/postgis.control确认权限设置。 - 如果是搜索路径问题,执行
SHOW search_path;,确保extension在路径中,若不在则执行SET search_path TO "$user", public, extension;。
- 如果提示权限问题,检查PostgreSQL服务用户(通常为
重置影子数据库
删除已存在的影子数据库(可从Prisma日志中获取数据库名称),然后重新执行迁移命令,让Prisma重新创建影子库。
内容的提问来源于stack exchange,提问作者GongFu
相关产品推荐
相关产品推荐

