postgresql 为什么我会看到“PG::未定义函数:错误:函数gen_random_uuid()不存在于“新产品中,但不存在于dev或旧产品中?

enyaitl3  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(687)

我有一个可以在本地运行的Rails 7/PostgreSQL,目前部署在Heroku上。我正在将其迁移到一个运行Ubuntu 22 LTS(最初是Ubuntu 20 LTS)的VPS上,但当我试图运行迁移(直接或通过Capistrano)时,它们失败了,并出现错误“PG::UndefinedFunction:错误:函数gen_random_uuid()不存在”
第一次(共十次!)迁移失败了,所以我没有重写历史和insert/modify an early migration,而是通过手动创建pgcrypto扩展在服务器上修复了它:

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

我的问题是,为什么我需要在Ubuntu上创建/启用这个扩展,而不是在macOS或Heroku上?据我所知,我没有做任何事情来启用我的Mac上的扩展,我只是运行rails new myapp --database=postgresql和使用create_table :people, id: :uuid do |t|在我的第一次迁移。
在我的Mac电脑上,我使用的是Postgres 14.5(psql (PostgreSQL) 14.5 (Homebrew)),在Ubuntu 22 LTS服务器上,我也使用的是Postgres 14.5(psql (PostgreSQL) 14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))。
当我第一次注意到它的时候,我在服务器上使用的是不同版本的PostgreSQL(psql (PostgreSQL) 12.12 (Ubuntu 12.12-0ubuntu0.20.04.1)。
根据Heroku Postgres web dashboard,我在Heroku上使用的是13.9版本。
更奇怪的是,当我在development和prod中检查该数据库的已安装扩展时,pgcrypto甚至都没有列出:

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

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

我的:uuid色谱柱在这两个平台上的工作情况如何!?

z2acfund

z2acfund1#

这个解释毕竟很简单:
gen_random_uuid()被添加到Postgres 13的主发行版中。(请检查带有SELECT version();的Postgres版本)
这与服务器的操作系统无关。
这也与交互终端psql的版本(其可以不同于服务器版本)无关。
Postgres 13的release notes
添加函数gen_random_uuid()以生成版本4 UUID(Peter Eisentraut)
以前,UUID生成功能仅在外部模块uuid-ossppgcrypto中可用。

相关问题