我做了一个复杂的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新手很难。
答案 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