LoginSignup
7
3

More than 5 years have passed since last update.

ElixirのEctoでSQLを直接投げる

Last updated at Posted at 2018-01-25

mix phx.gen.~を使うと、RailsのActiveRecordチックに、ModelとDBアクセッサ関数を自動生成してくれるが、DBアクセッサ関数のみだと、非効率なselectにしてしまうケース…たとえば、get_xxxxx()で毎回1行ずつ取り出してロジック側でループしてしまうバッドパターンがRails同様にあるし、joinやgroup_by等はDBアクセッサ関数でフォローされないため、自由にSQLを書きたいニーズがある

そういうときは、以下のようなEctoの使い方をすればOK

    sql = "select * from hoge inner join foo on hoge.customer_id = foo.customer_id"
    { :ok, result } = Ecto.Adapters.SQL.query( Livery.Repo, sql, [] )

以下のように関数化しておくと便利かも知れない

    def query( sql ) when sql != "" do
        { :ok, result } = Ecto.Adapters.SQL.query( Livery.Repo, sql, [] )
        result
    end

Repoの指定が、固定だと困る場合は、モジュールを引数渡しするか、Agentに持たせる等で工夫する

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3