PG :: UndefinedObject:错误:类型“hstore”不存在但它确实存在

时间:2014-02-20 13:34:01

标签: ruby-on-rails postgresql hstore

首先,这可能看起来像是重复:

postgres hstore exists and doesn't exist at same time

但事实并非如此。虽然我在这种情况下收到相同的错误消息。在检查数据库中是否安装了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 DB上。

因此,当我尝试运行迁移以添加hstore时,我得到了PG::Error: ERROR: extension "hstore" already exists,当我注释掉这个迁移时,在下一个需要hstore的情况下,它会显示PG::UndefinedObject: ERROR: type "hstore" does not exist这有点悖论。

这是一个带有postgresql 9的Rails 4.0.1应用程序,我让hstore处理在这台机器上运行的其他一些项目。

3 个答案:

答案 0 :(得分:10)

您已在名为hstore的架构中安装了hstore扩展程序,该架构可能不在您的默认search_path上。

您必须执行以下操作之一:

  • 在连接设置期间将hstore添加到search_path;
  • 使用hstoresearch_path
  • ALTER USER ... SET添加到ALTER DATABASE ... SET
  • 将hstore扩展名从hstore架构移至public;或
  • 架构 - 限定对hstore的所有引用,例如hstore.hstore(...)。这也必须为运营商做; ->变为OPERATOR(hstore.->)

答案 1 :(得分:4)

这就是我解决问题的方法。 创建一个名为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;"

答案 2 :(得分:0)

这就是我在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;

尽管可能有不同的保存方式,但是我以这种方式解决了。

希望这会帮助像我这样的新手。