2016-02-01 12 views
6

Phoenixアプリケーションに特定のPostgresスキーマを使用したいと思います。Postgres search_pathをEctoに変更する

Ecto.Repo.after_connect/1コールバックでこれを達成しようとしましたが、タイムアウトするまでに約10回新しいdb接続を再帰的に作成するようです。ここで

は私のレポファイルです:

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

を--Kip、助け'alter user set ... 'を使用しているユーザーの検索パス –

+0

私はしたくありません。私の目的は、3つの異なるアプリケーション間で1つのHeroku Postgresデータベースを共有することです(それぞれ1つはスキーマを持ちます) – Chris

+0

3つの異なるユーザーを作成し、それぞれのスキーマをデフォルトのsearch_pathとして作成するのはなぜですか? –

答えて

6

私は、after_connectがectoのセットアップサイクルでまだ早すぎるため、タイムアウトが発生すると思います。 ecto 2(まだベータ版)を使用すると、ecto 1で動作するかどうかは、接続をafter_connectionのパラメータとして取得するかどうかによって異なります)。あなたのレポで

:あなたのconfig.exsファイルで

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 :et, Et.Repo, 
    adapter: Ecto.Adapters.Postgres, 
    database: "......", 
    username: "......", 
    hostname: "localhost", 
    after_connect: {Et.Repo, :set_search_path, ["app,public,extensions"]} 

希望あなたは永久にそれをしたい場合は、変更することができます

4

私は同じ問題があったが、私が発見した最初のソリューションは、私のアプリケーションのレポモジュールへのすべてのアクセスで(postgresの中で、スキーマと呼ばれる)prefixを追加しました。 最近のバージョンのectoとphoenix_ectoでは、ポストグルのモデルのスキーマを修正するには、属性@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

これまで私が見つけた最高のソリューションです:) –

関連する問題