我一直在尝试迁移我的数据库以使用HSTORE,但是当我想在其他模式中添加HSTORE列时,该扩展仅适用于 public SCHEMA
def up
# My hstore looks like this
execute "CREATE EXTENSION hstore SCHEMA public"
# I have also tried
# execute "CREATE EXTENSION hstore"
end
但是当我运行我的下一次迁移时它只是不起作用,如果我去psql控制台并改变表格,我得到这个:
set search_path to public;
alter table accounts add column extras hstore; -- Works fine
set search_path to schema2;
alter table accounts add column extras hstore; -- Raises an error
我正在使用rails 4 感谢。
答案 0 :(得分:5)
您需要以与架构命名和搜索路径一致的方式引用对象。例如:
CREATE EXTENSION hstore SCHEMA public;
SET search_path TO schema2;
ALTER TABLE accounts ADD COLUMN extras public.hstore;
或
SET search_path TO public;
ALTER TABLE schema2.accounts ADD COLUMN extras hstore;
答案 1 :(得分:5)
如果您使用多种不同的模式,我建议将hstore
放在自己的模式中,并确保它始终位于search_path
上。您可能始终不希望public
search_path
CREATE SCHEMA hstore;
CREATE EXTENSION hstore WITH SCHEMA hstore;
,并且保持分区是件好事。
search_path
...然后使用hstore.hstore
作为类型名称OPERATOR(hstore.->)
,始终如一地修改SELECT hstore.hstore('"x" => "42"') OPERATOR(hstore.->) "x"
,或者始终对所有内容进行架构限定。 E.g。
hstore
或者,将pg_catalog
安装到CREATE EXTENSION hstore WITH SCHEMA pg_catalog;
:
pg_catalog
{{1}}始终隐含在搜索路径上。
答案 2 :(得分:1)
Peter Eisentraut的替代方案是修改您的搜索路径,以便公共架构始终位于搜索路径上。
如果您依赖多租户应用程序的模式(这是我的情况),这将特别有用。
在database.yml
文件中,您可以输入以下说明:
schema_search_path: "schema2, public"
注意:首先放置主模式。
如果您想在代码中以更动态的方式更改搜索路径,可以使用connection.schema_search_path