/var/log/messages

Nov 17, 2018 - 2 minute read - Comments - programming

elixir もくもく

以下なもくもく、リモート枠は一杯らしく、単独でもくもくしてみた記録を。

DB 接続の回

にて出てきていた接続な手続きがちょっと気になった、というか elixir な書き方が、なのかどうかはアレですが、ちょっと確認してみました。

DB アクセスモジュール、として以下な記載がありまして

defmodule Db do
  def query( sql ) when sql != "" do
    { :ok, result } = Ecto.Adapters.SQL.query( SampleDb.Repo, sql, [] )
    result
  end
  def columns_rows( result ) do
    result
    |> rows
    |> Enum.map( fn row -> Enum.into( List.zip( [ columns( result ), row ] ), %{} ) end )
  end
  def rows( %{ rows: rows } = _result ), do: rows
  def columns( %{ columns: columns } = _result ), do: columns
end

なんだこれは、と言いつつぐーぐる先生に聞いてみたところ、以下なエントリが案内され

その中でも似たようなコードの記述がありました。

defmodule MariadbSample.PageController do
  ...
  def to_column_map(columns, rows) do
    Enum.map(rows, fn row -> Enum.into(List.zip([columns, row]), %{}) end)
  end

  def select_all(conn, _params) do
    case Ecto.Adapters.SQL.query(MariadbSample.Repo, "SELECT id, name, abv from ipa_t", []) do
      {:ok, result} -> json conn, to_column_map(result[:columns], result[:rows])
      {:error, e} -> json conn, %{error: e}
    end
  end

以下なフォロー記述がありました。

  • Ecto.Adapters.SQL.query が SQL 発行
  • 第三引数にバインドするパラメータのリストを指定
  • 返却は成功したら {:ok, …}、失敗したら {:error, …} という形

select_all の中身を見るに result は辞書になってて :columns と :rows というキーを持っていることがわかります。

で、何となく二つの記述を眺めるに、なんとなくですがイメージできるなと (を

ただ

最初何が微妙だったかというと

  def rows( %{ rows: rows } = _result ), do: rows

というナニだったのですが、これが

result[:rows]

と同義、ってのが面白いですね。