如何在Prisma Accelerate与Supabase中配置?pgbouncer=true?
解决Supabase Postgres + Prisma Accelerate的42P05错误与连接字符串无效问题
问题核心
ConnectorError: 42P05(prepared statement不存在)是因为Prisma的预编译语句机制和Supabase的Supavisor连接池不兼容——连接池复用连接时,预编译语句的上下文丢失,导致报错。直接给Prisma Accelerate连接串加?pgbouncer=true会触发无效错误,是因为Acc的连接串有专属格式,不支持直接追加参数。
解决步骤
通过Prisma Schema配置pgBouncer兼容,而非修改连接串
保留Prisma Accelerate提供的原始连接串,在schema.prisma的datasource块中直接添加pgbouncer = true配置:datasource db { provider = "postgresql" url = env("DATABASE_URL") // 这里用Acc的原始连接串,不要加额外参数 pgbouncer = true // 启用pgBouncer兼容模式 }这个配置会让Prisma自动适配Supabase的连接池规则,避免预编译语句失效问题,同时不会触发Acc的连接串校验错误。
升级Prisma版本到最新
新版本的Prisma Client对pgBouncer和Supabase的兼容性做了优化,能减少这类连接池相关的报错。执行以下命令升级:npm update @prisma/client prisma极端情况:禁用预编译语句缓存
如果上述配置仍有报错,可在实例化Prisma Client时禁用预编译语句缓存:import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient({ transactionOptions: { maxPreparedStatements: 0, // 关闭预编译语句缓存 }, })注意:这会带来轻微的性能损耗,但能彻底解决预编译语句相关的连接池问题。
额外注意点
确认Supabase控制台中,数据库的连接池模式是transaction(默认配置),如果是session模式,需要调整为transaction才能配合pgBouncer兼容设置正常工作。
内容的提问来源于stack exchange,提问作者Tittoh
相关产品推荐
相关产品推荐

