从终端使用 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 任务假定应用程序具有 单个 存储库(数据存储)。
在 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 任务假定应用程序具有 单个 存储库(数据存储)。