【问题标题】:Why am I getting "PG::UndefinedFunction: ERROR: function gen_random_uuid() does not exist" in new prod but not dev or old prod?为什么我在新产品中得到“PG::UndefinedFunction: ERROR: function gen_random_uuid() does not exist\”,但在开发或旧产品中却没有?
【发布时间】:2022-11-22 17:39:41
【问题描述】:

我有一个现有的 Rails 7/PostgreSQL,我可以在本地运行并且目前部署在 Heroku 上。我正在将它迁移到运行 Ubuntu 22 LTS(最初是 Ubuntu 20 LTS)的 VPS,但是当我尝试运行迁移(直接或通过 Capistrano)时,它们失败并出现错误“PG::UndefinedFunction: ERROR: function gen_random_uuid() does not存在”

第一次(十次!)迁移失败,所以我没有重写历史和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 版。

更奇怪的是,当我在开发和生产中检查该数据库的已安装扩展时,甚至没有列出 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 专栏如何在这两个平台上运行!?

【问题讨论】:

    标签: ruby-on-rails postgresql ubuntu heroku


    【解决方案1】:

    毕竟,解释很简单:
    gen_random_uuid() 已添加到 Postgres 13 的主要发行版中。(使用 SELECT version(); 检查 Postgres 版本)

    这与服务器的操作系统无关。
    这也与交互式终端psql 的版本无关(可能与服务器版本不同)。

    Postgres 13 的release notes

    添加函数gen_random_uuid() 生成版本 4 UUID (彼得·艾森特劳特)

    以前的 UUID 生成函数仅在 外部模块uuid-ossppgcrypto

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 2022-08-17
      • 2015-09-14
      相关资源
      最近更新 更多