首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个模式创建HSTORE

使用多个模式创建HSTORE
EN

Stack Overflow用户
提问于 2013-12-26 19:35:18
回答 3查看 1.5K关注 0票数 3

我一直试图将我的数据库迁移到拥有HSTORE,但是当我想在其他模式中添加HSTORE列时,扩展只对公共模式起作用。

代码语言:javascript
复制
def up
  # My hstore looks like this
  execute "CREATE EXTENSION hstore SCHEMA public"
  # I have also tried
  # execute "CREATE EXTENSION hstore"
end

但是,当我运行下一次迁移时,它就不能工作了,如果我转到psql控制台并修改表,就会得到以下结果:

代码语言:javascript
复制
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谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-26 20:01:49

您需要以与模式命名和搜索路径一致的方式引用对象。例如:

代码语言:javascript
复制
CREATE EXTENSION hstore SCHEMA public;

SET search_path TO schema2;
ALTER TABLE accounts ADD COLUMN extras public.hstore;

代码语言:javascript
复制
SET search_path TO public;
ALTER TABLE schema2.accounts ADD COLUMN extras hstore;
票数 5
EN

Stack Overflow用户

发布于 2013-12-27 00:37:27

如果您使用多个不同的模式,我建议将hstore放在自己的模式中,并确保它始终在search_path上。您可能不希望public在任何时候都在您的search_path上,保持分区是很好的。

代码语言:javascript
复制
CREATE SCHEMA hstore;
CREATE EXTENSION hstore WITH SCHEMA hstore;

..。然后,要么始终如一地修改您的search_path,要么始终使用模式--限定所有内容,使用hstore.hstore作为类型名称OPERATOR(hstore.->)。例如。

代码语言:javascript
复制
SELECT hstore.hstore('"x" => "42"') OPERATOR(hstore.->) "x"

或者,将hstore安装到pg_catalog中是安全的

代码语言:javascript
复制
CREATE EXTENSION hstore WITH SCHEMA pg_catalog;

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

票数 5
EN

Stack Overflow用户

发布于 2013-12-26 21:11:54

替代Peter的答案是修改搜索路径,以便公共模式总是在搜索路径上。

如果您依赖于多租户应用程序的模式(这就是我的情况),这尤其有用。

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

schema_search_path: "schema2, public"

注意:将主模式放在第一位。

如果要在代码中以更动态的方式更改搜索路径,可以使用connection.schema_search_path

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20790242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档