ActiveRecord: добавлено расширение "uuid-ossp", но функции uuid недоступны - PullRequest
0 голосов
/ 11 марта 2019

Использование rails-5.0.7.1 (согласно bundle show rails)

Я написал миграцию, которая добавляет расширение "uuid-ossp", и выполняется SQL, и расширение появляется, когда я набираю \dx вконсоль psql.Однако функции, предоставляемые этим расширением (например, uuid_generate_v4), НЕ отображаются, когда я набираю \df, и поэтому любая попытка использовать функции, которые должны быть добавлены, завершается неудачей.

Когда я беруВыполните миграцию SQL из ActiveRecord и скопируйте + вставьте его непосредственно в консоль 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

  ...

^ эта миграция будет выполняться без ошибок, но она все равно не сделает функции доступными.

Таким образом, тот же SQL + копирования и вставки, который работает в psql, не работаетработать через метод ActiveRecord execute, который меня действительно озадачивает.Я не уверен, какой кусок мне не хватает, из-за чего это не получается.

1 Ответ

1 голос
/ 11 марта 2019

Я предполагаю, что схема, в которой установлено расширение, отсутствует на вашем search_path.

Вы можете увидеть эту схему с

\dx "uuid-ossp"

Попробуйте квалифицировать функции по схеме, как в public.uuid_generate_v4().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...