使用多个模式创建HSTORE

时间:2013-12-26 19:35:19

标签: ruby-on-rails postgresql ruby-on-rails-4 hstore

我一直在尝试迁移我的数据库以使用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 感谢。

3 个答案:

答案 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