我做了一个复杂的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 结果这样的数据库值。我希望我得到像 Map 这样的值,无论是键还是值。
结果是打击。
%Mariaex.Result{columns: ["item_id", "amount"], connection_id: nil, last_insert_id: nil, num_rows: 1, rows: [[42, #Decimal<4>]]}, :get, [])
我应该自己检索还是有通用和智能的方法?希望最后的结果是 Phoenix 模板 html 的输出。
我正在尝试像这样将结果值更改为 Map 。
item_result =
{:ok, result} ->
rows = result.get(:rows)
columns = result.get(:columns)
Enum.zip(columns, rows)
但是对于仙药新手来说,难度很大。
我想出了如何使用 Ecto 处理原始 SQL。我只是把问题分成小部分。
(1)sum()
在 mysql 的情况下返回 Decimal 值。
query = "select item_id, sum(unit) amount from sales where item_id = ? "
result = Ecto.Adapters.SQL.query(Repo, query, [item_id])
=> 我需要将#Decimal
值转换为#Integer
在 Elixir 中使用 Decimal.to_integer/1。
(2)Ecto.Adapters.SQL.query
返回 {:ok, results}
=> 我应该收到{:ok, results}
作为返回值。
(3) 检索:columns
和:rows
columns = results.columns
rows = results.rows
(4) 将这些值 colums 和 rows 放在一起
Enum.zip(columns, rows) |> Enum.into(%{})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句