如何使用 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(%{})
我弄复杂了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(%{})