2016-02-01 69 views
6

我想爲我的Phoenix應用程序使用特定的Postgres架構。使用Ecto更改Postgres search_path

我試圖用Ecto.Repo.after_connect/1回調實現這一點,但似乎遞歸創建新的db連接約10倍,然後超時。

這裏是我的回購協議文件:

defmodule MyApp.Repo do 

    use Ecto.Repo, otp_app: :my_app 
    use Scrivener, page_size: 20 

    def after_connect(_pid) do 
    IO.puts "after_connect" 
    Ecto.Adapters.SQL.query(MyApp.Repo, "SET search_path TO 'my_app';", []) 
    end 

end 
+0

如果你想這樣做永久,你可以改變使用'alter user set ...'的用戶的搜索路徑... –

+0

我不想。我的目的是在3個不同的應用程序之間共享一個Heroku Postgres數據庫(每個應用程序都有一個模式) – Chris

+0

那麼爲什麼不創建三個不同的用戶,每個用戶都將特定的模式作爲默認的search_path? –

回答

6

我認爲發生超時是因爲after_connect在ecto的設置週期中還太早。使用ecto 2(仍在測試版)下面的工作,它是否在ecto 1中工作取決於您是否將連接作爲after_connection中的參數)。

在您的回購:

defmodule Et.Repo do 
    use Ecto.Repo, otp_app: :et 

    def set_search_path(conn, path) do 
    {:ok, _result} = Postgrex.query(conn, "SET search_path=#{path}", []) 
    end 
end 

在你config.exs文件:

config :et, Et.Repo, 
    adapter: Ecto.Adapters.Postgres, 
    database: "......", 
    username: "......", 
    hostname: "localhost", 
    after_connect: {Et.Repo, :set_search_path, ["app,public,extensions"]} 

希望幫助,--Kip

4

我有同樣的問題,我已經找到了第一個解決方案是在每次訪問我的應用程序的回購模塊添加prefix(稱爲模式,在Postgres的)。 但是在ecto和phoenix_ecto的最新版本中,您可以修改模型的postgres模式,只需添加屬性@schema_prefix "your_schema"即可。

例子:

defmodule YourApp.YourModel do 
    use YourApp.Web, :model 

    @schema_prefix "your_schema" 
    schema "your_model" do 
    field :name, :string 
    end 

    # more stuff... 
end 

您可以查看討論有關此功能,而另一個辦法來解決這個問題,在胞外的github上:https://github.com/elixir-lang/ecto/issues/978

PS:這解決了你的模型數據庫的訪問,但對於其他常規查詢,您可以在您的查詢中指定前綴:

%{query | prefix: "your_schema"} 

我希望我幫了忙!

+0

謝謝費爾南多。這是迄今爲止最好的答案,但我正在尋找一種不太突出的方式來切換模式。我現在就要繼續這樣做。 – Chris

+0

這是迄今爲止我發現的最好的解決方案:) –