从终端使用 Phoenix/Ecto 打印记录数

Print the record count using Phoenix/Ecto from the terminal

在 Rails 应用程序上,我们可以通过如下命令打印数据库 table 的记录数:

rails r "puts User.count"

据我所知,如果我们想在 Phoenix/Ecto 环境中做同样的事情,我们应该 运行 这样的命令:

mix run -e "IO.puts SampleApp.Repo.aggregate(SampleApp.User, :count, :id)"

还可以,但对于日常使用来说太长了。有没有更短的方法?

开箱即用,没有。

然而,您可以在 SampleApp 模块中定义一个函数以使其更短。像这样的东西应该可以解决问题(我还没有测试过):

defmodule SampleApp do
  ...

  def count(model)
    IO.puts Repo.aggregate(model, :count, :id)
  end
end

那么你可以这样做:

mix run -e "SampleApp.count(SampleApp.User)"

lib/mix/tasks目录下创建一个文件db.count.ex如下:

defmodule Mix.Tasks.Db.Count do
  use Mix.Task
  import Mix.Ecto

  @shortdoc "Print the row count of a database table"

  def run(args) do
    [repo|_] = parse_repo([])
    ensure_started(repo, [])

    app_name = Mix.Project.config[:app] |> Atom.to_string |> Macro.camelize
    model_name = List.first(args) |> Macro.camelize

    IO.puts repo.aggregate(Module.concat(app_name, model_name), :count, :id)
  end
end

然后你可以得到LineItem模型的行数:

mix db.count line_item

请注意,上面的 Mix 任务假定应用程序具有 单个 存储库(数据存储)。