首先,这可能看起来像是重复:
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处理在这台机器上运行的其他一些项目。
答案 0 :(得分:10)
您已在名为hstore
的架构中安装了hstore
扩展程序,该架构可能不在您的默认search_path
上。
您必须执行以下操作之一:
hstore
添加到search_path
; hstore
或search_path
ALTER USER ... SET
添加到ALTER DATABASE ... SET
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中解决此问题的方式。
提供postgres超级用户访问权限。
sudo su postgres
然后我运行:
psql -U postgres 您的数据库名称 -c'创建扩展名hstore;'
现在,我可以更改表your_database_name并在其中添加hstore类型的列。
连接到数据库
psql -d 您的数据库名称 -U 您的用户角色
和
alter table your_table_name add your_column_name HSTORE;
尽管可能有不同的保存方式,但是我以这种方式解决了。
希望这会帮助像我这样的新手。