ActiveRecord:添加了“ uuid-ossp”扩展名,但没有可用的uuid功能

时间:2019-03-11 14:08:38

标签: postgresql activerecord ruby-on-rails-5 postgresql-extensions

使用rails-5.0.7.1(根据bundle show rails

我编写了一个迁移,其中添加了"uuid-ossp"扩展名,并且执行了SQL,并且当我在\dx控制台中键入psql时,扩展名就会显示出来。但是,当我键入uuid_generate_v4时,此扩展名提供的功能(例如\df)不会显示,因此使用应添加的功能的任何尝试都会失败。

当我从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方法来使用,这确实使我感到困惑。我不确定我丢失了哪一块导致失败。

1 个答案:

答案 0 :(得分:1)

我假设安装扩展的架构不在您的search_path上。

您可以看到具有该模式的

\dx "uuid-ossp"

请尝试使用模式限定功能,例如在public.uuid_generate_v4()中。