为何新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
相关产品推荐
相关产品推荐

