如何使用 Ecto 获取原始 sql 返回的数据库值

How to get DB values returned by raw sql with Ecto

我弄复杂了SQL。这样我就可以使用原始查询。 我已经提到 但我还是堆了。

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

但是我不知道如何像 Ecto 结果一样检索 DB 值。 我希望我能得到像 Map 这样的带有键和值的值。

结果一败涂地

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

是自己找还是有通用的聪明的办法? 希望最后的结果是 Phoenix 模板的输出 html.

我正在尝试将结果值更改为这样的地图。

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

不过对于仙丹新手来说还是比较难的

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

(1) sum() returns mysql.

情况下的十进制值
query = "select item_id, sum(unit) amount from sales where item_id = ? "
result = Ecto.Adapters.SQL.query(Repo, query, [item_id])

=> 我需要在 Elixir 中使用十进制将 #Decimal 值转换为 #Integer。to_integer/1。

(2) Ecto.Adapters.SQL.query returns {:ok, 结果}

=> 我应该 {:ok, results} 收到 return 值。

(3) 检索 :columns:rows

columns = results.columns
rows = results.rows

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

Enum.zip(columns, rows) |> Enum.into(%{})