问题
First of all, this may look like a duplicate of:
postgres hstore exists and doesn't exist at same time
but it is not. While I am getting the same error message in the circumstance. When checking to see if hstore is installed on the DB, we can see that it is:
./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
and it is too on the template_1 DB.
So, when I try to run the migration to add the hstore, I get the PG::Error: ERROR: extension "hstore" already exists
and when I comment out this migration, on the next one, which requires the hstore, it says PG::UndefinedObject: ERROR: type "hstore" does not exist
which is a bit of a paradox.
It is a Rails 4.0.1 app with postgresql 9 and I have hstore working on a few other projects running on this machine.
回答1:
You have installed the hstore
extension in a schema named hstore
which is presumably not on your default search_path
.
You must do one of these:
- Add
hstore
tosearch_path
during connection setup; - Add
hstore
tosearch_path
with anALTER USER ... SET
orALTER DATABASE ... SET
; - Move the hstore extension from the
hstore
schema intopublic
; or - schema-qualify all references to
hstore
, e.g.hstore.hstore(...)
. This must be done for operators too;->
becomesOPERATOR(hstore.->)
回答2:
This is how I solved the problem. Create a schema called extensions and grant authorization to the db username you use in the project.
psql -U postgres -d template1 -c "CREATE SCHEMA extensions AUTHORIZATION <yourDbUserName>;"
create the extensions in the created schema (extensions)
psql -U postgres -d template1 -c "CREATE EXTENSION IF NOT EXISTS hstore SCHEMA extensions;"
来源:https://stackoverflow.com/questions/21909417/pgundefinedobject-error-type-hstore-does-not-exist-but-it-does