Использование 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
, который меня действительно озадачивает.Я не уверен, какой кусок мне не хватает, из-за чего это не получается.