Миграция Rails + Postgres - почему я получаю сообщение об ошибке "PG::UndefinedFunction: ERROR: функция gen_random_uuid() не существует"?
Одна из моих миграций на Rails использует uuid в качестве первичного ключа. Расширение Postgres gen_random_uuid()
должен решить эту проблему, но я продолжаю получать ошибку после установки соответствующего расширения (uuid-ossp
).
4 ответа
Проблема заключалась в том, что uuid-ossp
расширение удалялось с базой данных каждый раз, когда я сбрасывал базу данных как часть сброса и миграции (например, rake db:drop db:create db:migrate
).
Исправление состоит в том, чтобы создать миграцию, запускаемую перед всеми другими миграциями, которая включает соответствующие расширения. Вот так (db/migrate/0_enable_extensions.rb
):
class EnableExtensions < ActiveRecord::Migration[5.1]
def change
enable_extension 'uuid-ossp'
enable_extension 'pgcrypto'
end
end
Я получил ту же ошибку после создания модели с uuid в качестве первичного ключа, например:
rails g scaffold user name --primary-key-type=uuid
Я забыл загрузить расширение pgcrypto в файл миграции.
Решение:
Просто добавьте это
enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')
в файл миграции следующим образом:
class CreateUsers < ActiveRecord::Migration[7.0]
enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto') # <-- HERE
def change
create_table :users, id: :uuid do |t|
t.string :name
t.timestamps
end
end
end
затем
rake db:migrate
преуспеет.
Edge case answer:
Добавьте миграцию, включив расширение, как указано выше.
Если вы ранее имели bigint
идентификаторы и вы переходите к UUID
, Бег rake db:reset db:migrate
не удалось для меня. Обязательно беги rake db:drop db:create db:migrate
как указано выше!
Если вы получили ошибку Environment data not found in the schema
, бежать bin/rails db:environment:set RAILS_ENV=development
,
Эта ошибка сильно ударила меня, хотя у меня были обаuuid-ossp
&pgcrypto
расширение. После большого количества проб и ошибок удалось найти исправление.
Для меня это было несколько баз данных, которые присутствовали, и было несколько ожидающих миграций в базе данных не по умолчанию. Чтобы исправить, я просто побежал
RAILS_ENV=development rails db:drop:all
RAILS_ENV=development rails db:create:all
RAILS_ENV=development rails db:migrate:all
И то же самое для тестовой среды.
RAILS_ENV=test rails db:drop:all
RAILS_ENV=test rails db:create:all
RAILS_ENV=test rails db:migrate:all
Надеюсь, это поможет людям, работающим над несколькими базами данных.