簡體   English   中英

使用多個模式創建HSTORE

[英]Create HSTORE with multiple schemas

我一直在嘗試遷移我的數據庫以使用HSTORE,但是當我想在其他模式中添加HSTORE列時,擴展僅適用於公共 SCHEMA,它不起作用

def up
  # My hstore looks like this
  execute "CREATE EXTENSION hstore SCHEMA public"
  # I have also tried
  # execute "CREATE EXTENSION hstore"
end

但是當我運行我的下一次遷移它只是不起作用,如果我去psql控制台和alter table我得到這個:

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謝謝。

您需要以與架構命名和搜索路徑一致的方式引用對象。 例如:

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放在自己的模式中並確保它始終位於search_path 你可能不希望在search_path上一直public ,並且保持search_path是很好的。

CREATE SCHEMA hstore;
CREATE EXTENSION hstore WITH SCHEMA hstore;

...然后使用hstore.hstore作為類型名稱OPERATOR(hstore.->) ,一致地修改search_path ,或者只是總是對所有內容進行模式限定。 例如

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

或者,將hstore安裝到pg_catalog是安全的:

CREATE EXTENSION hstore WITH SCHEMA pg_catalog;

pg_catalog總是隱含在搜索路徑上。

Peter Eisentraut的答案的替代方法是修改您的搜索路徑,以便公共模式始終位於搜索路徑上。

如果您依賴多租戶應用程序的模式(這是我的情況),這將特別有用。

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

schema_search_path: "schema2, public"

注意:首先放置主模式。

如果要在代碼中以更動態的方式更改搜索路徑,可以使用connection.schema_search_path

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM