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

JDBC插入数据时调用PostgreSQL自定义函数提示gen_random_bytes不存在如何解决

问题根因

你触发的错误是因为gen_random_bytes函数属于PostgreSQL的pgcrypto扩展模块,默认没有被加载到你的数据库实例中,所以调用失败。

解决步骤

步骤1:系统层面安装pgcrypto组件(按需执行)

大部分主流发行版的PostgreSQL官方安装包都会自带pgcrypto组件,若缺失可以执行对应命令安装:

  • Debian/Ubuntu系列:apt install postgresql-contrib
  • RHEL/CentOS系列:yum install postgresql-contrib
  • Windows/macOS官方安装包默认已经包含该组件,无需额外安装

步骤2:业务库中启用pgcrypto扩展

使用超级管理员账号(默认是postgres)连接到你实际使用的业务数据库,执行以下SQL:

CREATE EXTENSION IF NOT EXISTS pgcrypto;

注意:扩展是库级生效,必须连接到你的业务库执行,不能在默认的postgres库执行完就切换到业务库使用

步骤3:验证函数可用性

执行测试SQL验证逻辑是否正常:

SELECT generate_uid(50);

如果能正常返回50位随机字符串,说明配置已经生效,重新执行你的JDBC插入代码即可正常生成userid字段。

可选无依赖方案

如果不想额外启用扩展,也可以修改自定义函数,用PostgreSQL内置的random()函数实现相同逻辑,替换后的函数代码如下:

CREATE OR REPLACE FUNCTION generate_uid(size INT) RETURNS TEXT AS $$
DECLARE
  characters TEXT := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  l INT := length(characters);
  i INT := 0;
  output TEXT := '';
BEGIN
  WHILE i < size LOOP
    output := output || substr(characters, floor(random() * l + 1)::INT, 1);
    i := i + 1;
  END LOOP;
  RETURN output;
END;
$$ LANGUAGE plpgsql VOLATILE;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:36:03