我有一个可以在本地运行的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
色谱柱在这两个平台上的工作情况如何!?
1条答案
按热度按时间z2acfund1#
这个解释毕竟很简单:
gen_random_uuid()
被添加到Postgres 13的主发行版中。(请检查带有SELECT version();
的Postgres版本)这与服务器的操作系统无关。
这也与交互终端psql的版本(其可以不同于服务器版本)无关。
Postgres 13的release notes:
添加函数
gen_random_uuid()
以生成版本4 UUID(Peter Eisentraut)以前,UUID生成功能仅在外部模块uuid-ossp和pgcrypto中可用。