(PG::неопределенный объект: ОШИБКА: тип «hstore» не существует) в производстве rails

#ruby-on-rails #postgresql #digital-ocean

#ruby-on-rails #postgresql #digital-ocean

Вопрос:

У меня есть элемент с типом hstore, во время миграции для схемы он не работает, даже если база данных включена с расширением hstore.Я получаю (PG::UndefinedObject: ERROR: type "hstore" does not exist) ошибку во время миграции. Это отлично работает в local. Как заставить это действовать во всей схеме?

Ответ №1:

Чтобы создать расширение в вашей базе данных, вы должны явно подключиться к этой базе данных. Итак, если ваша база данных my_app_development, вы должны сделать :

 sudo -u postgres psql my_app_development
create extension hstore;
  

Кроме того, вы не указываете, на какой версии rails вы работаете. Если вы не используете rails-4, вам придется использовать драгоценный камень postgres hstore.

Комментарии:

1. ERROR: extension "hstore" already exists когда я запустил приведенную выше команду … 🙁

2. я использую rails 5, и gem не работает,. ` неопределенный метод alias_method_chain' for ActiveRecord::ConnectionAdapters::PostgreSQLColumn:Class (NoMethodError)

Ответ №2:

Это расширение, скорее всего, расположено в схеме вне search_path для пользователя, который используется в запросе, который выдал вам ошибку. Вы можете исправить это либо путем воссоздания расширения в общедоступной схеме:

 CREATE EXTENSION hstore WITH SCHEMA public;
  

Обратите внимание, что можно изменить настройку по умолчанию и не иметь public в search_path .

Или добавление в схему search_path, в которой hstore расположен по адресу:

 ALTER ROLE your_role_name
SET search_path = public, your_role_name, some_schema_with_hstore_extension;
  

Для вступления в силу требуется новое подключение. Вы также можете использовать SET search_path ... в сеансе, чтобы иметь немедленный эффект только для этого сеанса. На данный момент я не помню, требуются ли разрешения для your_role_name к схеме some_schema_with_hstore_extension и объектам hstore внутри нее; скорее всего, это требуется, но, возможно, уже предоставлено.

Ответ №3:

Это работает для меня.

 SELECT public.hstore_to_json(hstore_col) 
FROM ...;