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

为何新Ubuntu服务器报PG::UndefinedFunction错误,本地与Heroku正常?

Rails 7 + PostgreSQL 迁移至Ubuntu VPS时gen_random_uuid()不存在的问题

问题场景

我有一个基于Rails 7和PostgreSQL的应用,在本地macOS环境和Heroku平台上都能正常运行,但迁移到运行Ubuntu 22 LTS(原先是Ubuntu 20 LTS)的VPS时,执行数据库迁移(直接运行或通过Capistrano部署)失败,报错信息如下:

PG::UndefinedFunction: ERROR: function gen_random_uuid() does not exist

迁移失败后,我没有修改历史迁移文件,而是通过手动在服务器上创建pgcrypto扩展解决了问题,操作步骤如下:

myApp$  sudo su - postgres
postgres$  psql
postgres=#  \c myapp_production
myapp_production=#  CREATE EXTENSION pgcrypto;
                    CREATE EXTENSION
myapp_production=#  exit

核心疑问

我在macOS上仅执行了rails new myapp --database=postgresql初始化项目,然后在首个迁移文件中使用create_table :people, id: :uuid do |t|创建UUID类型的主键,全程没有手动启用任何PostgreSQL扩展,但应用能正常工作。

同样,Heroku上的生产环境也能正常使用UUID列,但检查已安装扩展时,pgcrypto并未在列表中。

环境版本信息

  • macOS本地:Postgres 14.5(通过Homebrew安装)
  • Ubuntu服务器:最初使用Postgres 12.12,后来升级到14.5
  • Heroku平台:Postgres 13.9

扩展查询结果

在macOS本地开发库中查询已安装扩展:

myapp_development=# \dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description          
---------+---------+------------+------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(1 row)

在Heroku生产库中查询已安装扩展:

myapp::DATABASE=> \dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description          
---------+---------+------------+------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(1 row)

为什么Ubuntu服务器需要手动创建pgcrypto扩展才能让UUID列正常工作,而macOS和Heroku环境不需要?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:01:22