我一直试图将我的数据库迁移到拥有HSTORE,但是当我想在其他模式中添加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谢谢。
发布于 2013-12-26 20:01:49
您需要以与模式命名和搜索路径一致的方式引用对象。例如:
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;发布于 2013-12-27 00:37:27
如果您使用多个不同的模式,我建议将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"或者,将hstore安装到pg_catalog中是安全的
CREATE EXTENSION hstore WITH SCHEMA pg_catalog;pg_catalog总是隐式地在搜索路径上。
发布于 2013-12-26 21:11:54
替代Peter的答案是修改搜索路径,以便公共模式总是在搜索路径上。
如果您依赖于多租户应用程序的模式(这就是我的情况),这尤其有用。
在您的database.yml文件中,您将放置以下指令:
schema_search_path: "schema2, public"
注意:将主模式放在第一位。
如果要在代码中以更动态的方式更改搜索路径,可以使用connection.schema_search_path。
https://stackoverflow.com/questions/20790242
复制相似问题