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

Postgres中CREATE EXTENSION异常:pgcrypto未安装到指定schema问题

为什么pgcrypto扩展被安装到public而不是指定的app_auth schema?

嘿,我明白问题出在哪了!核心原因是:如果你的数据库里public schema已经存在pgcrypto扩展,那么CREATE EXTENSION IF NOT EXISTS ... WITH SCHEMA app_auth这条语句会直接跳过安装操作,并不会把已有的扩展迁移到你指定的app_auth schema里。

PostgreSQL的CREATE EXTENSION IF NOT EXISTS逻辑很明确:只要目标扩展在数据库的任意schema中已经存在,就不会执行新的安装(包括不会修改它的存放位置);只有当扩展完全不存在时,才会按照你指定的WITH SCHEMA参数来创建。

先验证问题

你可以查一下系统表确认pgcrypto当前的位置:

SELECT extname, extnamespace::regnamespace 
FROM pg_extension 
WHERE extname = 'pgcrypto';

如果结果里extnamespace显示为public,那就实锤了——扩展早就存在于public schema,这就是你测试时调用app_auth.gen_random_bytes报错的原因。

解决方法很简单

要把pgcrypto装到app_auth schema,得先卸载已有的扩展,再重新指定schema安装:

-- 1. 先卸载已有的pgcrypto(如果存在)
DROP EXTENSION IF EXISTS pgcrypto;

-- 2. 重建app_auth schema(如果之前的操作没问题可以跳过这步)
DROP SCHEMA IF EXISTS app_auth CASCADE;
CREATE SCHEMA app_auth;

-- 3. 把pgcrypto安装到app_auth schema
CREATE EXTENSION pgcrypto WITH SCHEMA app_auth;

再测试看看

现在执行你的测试代码应该就没问题了:

-- 测试1:设置搜索路径为app_auth
SET search_path = app_auth;
SELECT gen_random_bytes(10); -- 这时候应该能正常返回结果

-- 测试2:直接指定schema调用
SELECT app_auth.gen_random_bytes(10); -- 同样能成功

这样就能确保pgcrypto的所有函数都在app_auth schema下可用啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:19:01