在Rails生产中(PG :: UndefinedObject:错误:类型“ hstore”不存在)

时间:2019-03-22 10:52:01

标签: ruby-on-rails postgresql digital-ocean

我有一个类型为hstore的元素,在模式迁移期间,即使使用hstore扩展名启用了数据库,该元素也无法工作。在迁移过程中,我收到了(PG::UndefinedObject: ERROR: type "hstore" does not exist)错误。这在本地完美工作。如何使其在所有架构中生效?

3 个答案:

答案 0 :(得分:1)

对于在给您带来错误的查询中使用的用户,该扩展名很可能位于search_path之外的模式中。 您可以通过在公共架构中重新创建扩展来解决此问题:

CREATE EXTENSION hstore WITH SCHEMA public;

请注意,可以更改默认设置,并且public中没有search_path

或添加到hstore位于以下位置的search_path模式中:

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并在其中存储对象;很有可能是必需的,但可能已被授予。

答案 1 :(得分:0)

要在数据库中创建扩展名,必须显式连接到该数据库。因此,如果您的数据库是my_app_development,则必须执行以下操作:

sudo -u postgres psql my_app_development
create extension hstore;

此外,您不知道您使用的是哪个Rails版本。如果您不在Rails-4上,则必须使用postgres hstore gem

答案 2 :(得分:0)

这对我有用。

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