Миграция 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

Надеюсь, это поможет людям, работающим над несколькими базами данных.

Другие вопросы по тегам