【问题标题】:Create HSTORE with multiple schemas创建具有多个模式的 HSTORE
【发布时间】:2014-01-14 10:17:22
【问题描述】:

我一直在尝试将我的数据库迁移到 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 谢谢。

【问题讨论】:

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


    【解决方案1】:

    如果您使用多个不同的架构,我建议将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 始终隐含在搜索路径中。

    【讨论】:

    • 不知道将 hstore ext 放入 pg_catalog。谢谢!
    • 哇,你能在 SO 上关注别人吗 :) 吗?这应该是公认的答案。
    【解决方案2】:

    Peter Eisentraut 的答案的替代方法是修改您的搜索路径,以便公共架构始终位于搜索路径上。

    如果您依赖于多租户应用程序的架构(这是我的情况),这将特别有用。

    在您的database.yml 文件中,您可以输入以下指令:

    schema_search_path: "schema2, public"

    注意:把你的主架构放在第一位。

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

    【讨论】:

      【解决方案3】:

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

      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;
      

      【讨论】:

      • 重要 注意,当你更改 schema 时,你必须始终使用公共路径进行更改,以便加载 hstore SET SEARCH_PATH TO schema2, public
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      相关资源
      最近更新 更多