#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 ...;