PG::UndefinedObject: ОШИБКА: тип hstore не существует, но существует

Прежде всего, это может выглядеть как дубликат:

магазин postgres существует и не существует одновременно

но это не так. Пока я получаю то же сообщение об ошибке в обстоятельстве. Проверяя, установлен ли hstore в БД, мы видим, что это так:

./psql -d photographerio_development -c '\dx'
                       List of installed extensions
  Name   | Version |   Schema   |                   Description                    
---------+---------+------------+--------------------------------------------------
 hstore  | 1.2     | hstore     | data type for storing sets of (key, value) pairs
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language

и это тоже на БД template_1.

Итак, когда я пытаюсь запустить миграцию, чтобы добавить hstore, я получаю PG::Error: ERROR: extension "hstore" already exists, а когда я комментирую эту миграцию, на следующей, для которой требуется hstore, появляется PG::UndefinedObject: ERROR: type "hstore" does not exist, что немного парадоксально.

Это приложение Rails 4.0.1 с postgresql 9, и у меня есть hstore, работающий над несколькими другими проектами, работающими на этой машине.


person Alain    schedule 20.02.2014    source источник


Ответы (3)


Вы установили расширение hstore в схему с именем hstore, которая, по-видимому, не соответствует вашей схеме search_path по умолчанию.

Вы должны выполнить одно из следующих действий:

  • Добавьте hstore к search_path при настройке соединения;
  • Добавьте hstore к search_path с помощью ALTER USER ... SET или ALTER DATABASE ... SET;
  • Переместите расширение hstore из схемы hstore в public; или
  • квалифицируйте по схеме все ссылки на hstore, например hstore.hstore(...). Это должно быть сделано и для операторов; -> становится OPERATOR(hstore.->)
person Craig Ringer    schedule 20.02.2014
comment
Добавление его в search_path было самым простым способом исправить это. - person Alain; 20.02.2014

Вот как я решил проблему. Создайте схему с именем extensions и предоставьте авторизацию имени пользователя db, которое вы используете в проекте.

psql -U postgres -d template1 -c "CREATE SCHEMA extensions AUTHORIZATION <yourDbUserName>;"

создать расширения в созданной схеме (расширения)

psql -U postgres -d template1 -c "CREATE EXTENSION IF NOT EXISTS hstore SCHEMA extensions;"
person tokhi    schedule 08.10.2015
comment
AUTHORIZATION это та часть, которую мне не хватало, спасибо! - person Eyal Roth; 04.01.2018

Вот как я решил эту проблему в Ubuntu 18.04.

  1. Предоставьте доступ суперпользователя postgres.

    sudo su postgres

  2. Затем я запускаю:

    psql -U postgres ваше_имя_базы_данных -c 'создать расширение hstore;'

Теперь я могу изменить таблицу your_database_name и добавить в нее столбцы типа hstore.

  • Подключиться к вашей базе данных

    psql -d ваше_имя_базы_данных -U ваша_пользовательская_роль

А также

alter table your_table_name add your_column_name HSTORE;

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

Надеюсь, это поможет начинающим пользователям, таким как я.

person Pravin Divraniya    schedule 29.07.2020