【发布时间】: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