将`sum`结果转换为Ecto中的整数

问题描述 投票:0回答:1

我在Ecto中有一个查询,包括包含整数的列的总和。我正在使用MySQL作为数据库。

EG

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))
)

有没有更好的办法?

elixir ecto
1个回答
1
投票

MySQL中的SUM返回整数输入的DECIMAL值。

SUM()和AVG()函数返回精确值参数(整数或DECIMAL)的DECIMAL值,以及近似值参数的DOUBLE值(FLOAT或DOUBLE)。

Source

因此,您有两个选择:将值转换为SIGNED,就像您已经在做的那样,或者使用Elixir中的Decimal.to_integer/1将Decimal值转换为整数。

© www.soinside.com 2019 - 2024. All rights reserved.