2

使用rails-5.0.7.1(根据bundle show rails

我编写了一个添加"uuid-ossp"扩展的迁移,并且 SQL 被执行,当我\dxpsql控制台中键入时,扩展显示出来。但是,当我键入 时,此扩展提供的功能(例如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) =====================

^ 这一切似乎运行成功,但没有启用任何功能。这意味着未来的 SQL 包含诸如... SET uuid = uuid_generate_v4() ...失败并出现此错误的语句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

  ...

^ 此迁移将正常运行,但仍无法使功能可用。

所以,同样的复制+粘贴 SQLpsql不能通过 ActiveRecordexecute方法工作,这让我很困惑。我不确定我错过了什么导致失败的部分。

4

1 回答 1

2

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

您可以看到该架构

\dx "uuid-ossp"

尝试使用模式限定函数,例如在public.uuid_generate_v4().

于 2019-03-11T14:24:37.830 回答