如何使用Ecto获取原始sql返回的DB值

时间:2018-02-16 14:57:35

标签: elixir phoenix-framework ecto

我做了一个复杂的SQL。所以我使用原始查询。 我已经提到了https://stackoverflow.com/questions/36042888/raw-sql-with-ecto 但我仍然堆积如山。

query = "select item_id, sum(unit) amount from sales where item_id = ? "
result = Ecto.Adapters.SQL.query(Repo, query, [item_id])

但是我不知道如何检索像Ecto结果一样的DB值。 我希望我能获得像Map和key这样的值。重视任何事情。

结果是打击。

%Mariaex.Result{columns: ["item_id", "amount"], connection_id: nil, last_insert_id: nil, num_rows: 1, rows: [[42, #Decimal<4>]]}, :get, [])

我应该自己检索还是有一般和聪明的方式? 希望最后的结果是Phoenix templates html的输出。

我试图将结果值更改为Map。

item_result =
  {:ok, result} ->
    rows = result.get(:rows)
    columns = result.get(:columns)
    Enum.zip(columns, rows)

但是elixir新手很难。

1 个答案:

答案 0 :(得分:2)

我想出了如何使用Ecto处理原始SQL。 我把问题分成了很小的部分。

(1)sum()在mysql的情况下返回十进制值。

query = "select item_id, sum(unit) amount from sales where item_id = ? "
result = Ecto.Adapters.SQL.query(Repo, query, [item_id])

=&GT;我需要使用Elixir中的Decimal.to_integer / 1将#Decimal值转换为#Integer

(2)Ecto.Adapters.SQL.query返回{:ok,results}

=&GT;我应该以{{1​​}}作为返回值收到。

(3)检索{:ok, results}:columns

:rows

(4)将这些值的列和行放在一起

columns = results.columns
rows = results.rows