我在Ecto中有一个查询,包括包含整数的列的总和。我正在使用MySQL作为数据库。
e.g。
result = Repo.one(
from v in Vote,
where: [post_id: 1],
select: sum(v.direction)
)
IO.inspect(result)
# Yields: #Decimal<5>
结果从Ecto返回#Decimal<x>
。当我将其编码为json时,它会被转换为字符串。理想情况下,我希望它是一个整数,特别是因为结果将始终是数据库中的整数。
最好的方法是什么?
这是我的架构:
schema "votes" do
field :direction, :integer
belongs_to :user, Linklet.User
belongs_to :link, Linklet.Link
timestamps()
end
我已经设法通过在片段中使用MySQL的CONVERT
函数来实现预期的结果,但它似乎不是最强大的方法:
result = Repo.one(
from v in Vote,
where: [post_id: 1],
select: fragment("CONVERT(?, SIGNED)", sum(v.direction))
)
有更好的方法吗?
答案 0 :(得分:1)
SUM
返回整数输入的DECIMAL
值。
SUM()和AVG()函数返回精确值参数的DECIMAL值(整数或DECIMAL),以及近似值参数的DOUBLE值(FLOAT或DOUBLE)。
所以你有两个选择:将值转换为你已经在做的SIGNED
,或者在Elixir中使用Decimal.to_integer/1
将Decimal值转换为整数。
答案 1 :(得分:1)
您可以使用 Ecto.Query.type/2 在数据库级别转换为整数:
result = Repo.one(
from v in Vote,
where: [post_id: 1],
select: type(sum(v.direction), :integer)
)