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