创建多个架构的HSTORE

3

我一直在尝试将我的数据库迁移到使用HSTORE,但是这个扩展只能在public SCHEMA中工作。当我想在其他模式中添加一个HSTORE列时,它就无法工作了。

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个回答

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;

重要提示:当您更改模式时,必须始终使用公共路径进行更改,以便加载hstore。请使用以下命令:SET SEARCH_PATH TO schema2, public - Boris Barroso

5

如果您正在使用多个不同的模式,请建议将 hstore 放在自己的架构中,并确保它始终位于 search_path 上。您可能并不总是想在 search_path 中放置 public,并且保持事物分隔开来是很好的。

CREATE SCHEMA hstore;
CREATE EXTENSION hstore WITH SCHEMA hstore;

如果你要使用search_path,请始终保持一致。或者,可以直接在所有操作中使用架构限定符号,例如将类型名更改为hstore.hstoreOPERATOR(hstore.->)。例如:

SELECT hstore.hstore('"x" => "42"') OPERATOR(hstore.->) "x"

或者,将hstore安全地安装到pg_catalog中:

CREATE EXTENSION hstore WITH SCHEMA pg_catalog;

pg_catalog 总是隐式地在搜索路径上。


不知道将hstore扩展放在pg_catalog中。谢谢! - Pierre
哇,你能在SO上关注别人吗 :)?这应该是被采纳的答案。 - Matt Bannert

1

对于 Peter Eisentraut 的答案的替代方案是修改搜索路径,使 public 模式始终在搜索路径上。

如果您依赖于多租户应用程序的模式(这是我的情况),则此方法特别有用。

在您的 database.yml 文件中,您将放置以下指令:

schema_search_path: "schema2, public"

注意:请将您的主要模式放在第一位。

如果您想以更动态的方式在代码中更改搜索路径,则可以使用 connection.schema_search_path 进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接