ActiveRecord:添加了 "uuid-ossp" 扩展,但没有可用的 uuid 函数
ActiveRecord: "uuid-ossp" extension added, but no uuid functions available
使用rails-5.0.7.1
(根据bundle show rails
)
我编写了一个添加 "uuid-ossp"
扩展的迁移,SQL 被执行,当我在 psql
控制台中键入 \dx
时扩展显示.但是,当我键入 \df
时,此扩展提供的功能(例如 uuid_generate_v4
)不会显示,因此任何尝试使用应添加的功能的尝试都会失败。
当我从 ActiveRecord 迁移中获取 SQL 并将其直接复制并粘贴到 psql
控制台时,一切都按预期工作 - 添加了扩展,并且功能可用。
这是我的迁移代码:
class EnableUuidOssp < ActiveRecord::Migration[5.0]
def up
enable_extension "uuid-ossp"
end
def down
disable_extension "uuid-ossp"
end
end
这是输出:
$ bundle exec rake db:migrate
== 20190308113821 EnableUuidOssp: migrating ==============================
-- enable_extension("uuid-ossp")
-> 0.0075s
== 20190308113821 EnableUuidOssp: migrated (0.0076s) =====================
^ 这一切似乎 运行 成功,但没有启用任何功能。这意味着包含 ... SET uuid = uuid_generate_v4() ...
等语句的未来 SQL 失败并出现此错误 HINT: No function matches the given name and argument types. You might need to add explicit type casts.
什么有效
直接进入 psql
并输入:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
^ 这将安装扩展并使功能可用。
然而,什么不起作用
好的,如果我采用上述 SQL 并以这种方式重写我的迁移:
...
def up
execute <<~SQL
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
SQL
end
...
^ 此迁移将 运行 没有错误,但仍无法使功能可用。
因此,在 psql
中有效的复制+粘贴 SQL 无法通过 ActiveRecord execute
方法起作用,这让我很困惑。我不确定我遗漏了什么导致失败。
我假设安装扩展的架构不在您的 search_path
上。
您可以通过
查看该架构
\dx "uuid-ossp"
尝试使用架构限定函数,如 public.uuid_generate_v4()
。
使用rails-5.0.7.1
(根据bundle show rails
)
我编写了一个添加 "uuid-ossp"
扩展的迁移,SQL 被执行,当我在 psql
控制台中键入 \dx
时扩展显示.但是,当我键入 \df
时,此扩展提供的功能(例如 uuid_generate_v4
)不会显示,因此任何尝试使用应添加的功能的尝试都会失败。
当我从 ActiveRecord 迁移中获取 SQL 并将其直接复制并粘贴到 psql
控制台时,一切都按预期工作 - 添加了扩展,并且功能可用。
这是我的迁移代码:
class EnableUuidOssp < ActiveRecord::Migration[5.0]
def up
enable_extension "uuid-ossp"
end
def down
disable_extension "uuid-ossp"
end
end
这是输出:
$ bundle exec rake db:migrate
== 20190308113821 EnableUuidOssp: migrating ==============================
-- enable_extension("uuid-ossp")
-> 0.0075s
== 20190308113821 EnableUuidOssp: migrated (0.0076s) =====================
^ 这一切似乎 运行 成功,但没有启用任何功能。这意味着包含 ... SET uuid = uuid_generate_v4() ...
等语句的未来 SQL 失败并出现此错误 HINT: No function matches the given name and argument types. You might need to add explicit type casts.
什么有效
直接进入 psql
并输入:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
^ 这将安装扩展并使功能可用。
然而,什么不起作用
好的,如果我采用上述 SQL 并以这种方式重写我的迁移:
...
def up
execute <<~SQL
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
SQL
end
...
^ 此迁移将 运行 没有错误,但仍无法使功能可用。
因此,在 psql
中有效的复制+粘贴 SQL 无法通过 ActiveRecord execute
方法起作用,这让我很困惑。我不确定我遗漏了什么导致失败。
我假设安装扩展的架构不在您的 search_path
上。
您可以通过
查看该架构\dx "uuid-ossp"
尝试使用架构限定函数,如 public.uuid_generate_v4()
。