Elixir

ElixirのEctoでSQLを直接投げる

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に持たせる等で工夫する