![](/img/trans.png)
[英]Rails 4 + PostgreSQL hstore, can't execute “CREATE EXTENSION 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.