Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何在自定义混合任务中从EXTO获取数据_Elixir_Phoenix Framework_Elixir Mix - Fatal编程技术网

Elixir 如何在自定义混合任务中从EXTO获取数据

Elixir 如何在自定义混合任务中从EXTO获取数据,elixir,phoenix-framework,elixir-mix,Elixir,Phoenix Framework,Elixir Mix,我想在自定义混合任务中通过EXTO显示数据库中的数据。我如何在我的任务中获得(或启动)异位回购 我尝试过类似的方法,但没有成功: defmodule Mix.Tasks.Users.List do use Mix.Task use Mix.Config use Ecto.Repo, otp_app: :app @shortdoc "List active users" @moduledoc """ List active users """ def run(

我想在自定义混合任务中通过EXTO显示数据库中的数据。我如何在我的任务中获得(或启动)异位回购

我尝试过类似的方法,但没有成功:

defmodule Mix.Tasks.Users.List do


use Mix.Task
  use Mix.Config
  use Ecto.Repo, otp_app: :app

  @shortdoc "List active users"
  @moduledoc """
    List active users
  """
  def run(_) do
    import Ecto.Query, only: [from: 1]

    Mix.shell.info "=== Active users ==="
    query = from u in "users"
    sync = all(query)
    Enum.each(users, fn(s) -> IO.puts(u.name) end)
  end

end
当我启动mix users.list时,这将为我提供以下输出:

** (ArgumentError) repo Mix.Tasks.Users.List is not started, please ensure it is part of your supervision tree
    lib/ecto/query/planner.ex:64: Ecto.Query.Planner.query_lookup/5
    lib/ecto/query/planner.ex:48: Ecto.Query.Planner.query_with_cache/6
    lib/ecto/repo/queryable.ex:119: Ecto.Repo.Queryable.execute/5

有什么想法或其他方法可以解决这个问题吗?

您需要确保在使用回购之前启动回购

MyApp.Repo.start_link

EXTO 3.x:

确保\u started
已从EXTO中删除。围绕着这个话题,有很多困惑。更多信息请参见此处。José建议要么使用
Mix.Task.run“app.start”
启动应用程序,要么使用
MyApp.repo.start\u链接(…)
运行repo

exto 2.x:

这曾经在2.x中工作,但显然
Mix.exto
不被认为是公共API的一部分

实际上有一个helper模块
Mix.exto
(),可以更轻松地编写使用exto的混合任务:

defmodule Mix.Tasks.Users.List do
  use Mix.Task
  import Mix.Ecto

  def run(args) do
    repos = parse_repo(args)

    Enum.each repos, fn repo ->
      Mix.shell.info "=== Active users ==="

      ensure_repo(repo, args)
      ensure_started(repo, [])
      users = repo.all(Ectotask.User)

      Enum.each(users, fn(s) -> IO.puts(s.name) end)
    end
  end
end
此帮助程序允许您访问
parse_repo/1
sure_repo/2
sure_start/1
parse_repo
将使您的任务与其他Exto mix任务很好地配合,例如,它将允许您通过-r来指定不同的repo

➤ mix users.list
=== Active users ===
Adam
➤ mix users.list -r Ectotask.Repo22
=== Active users ===
** (Mix) could not load Ectotask.Repo22, error: :nofile. Please pass a repo with the -r option.
确保\u已启动
确保回购正在运行,而这正是您所缺少的


为了获得指导和灵感,您可以看看如何在

上实现其他ecto混合任务。我在与Phoenix合作时也找到了另一种解决方案。我在
priv/repo
中创建了一个新文件,其中包括:

defmodule Users.List do
  def run() do
    Mix.shell.info "=== Active users ==="

    users = App.Repo.all(App.User)
    Enum.each(users, fn(s) ->
      Mix.shell.info("#{s.name}")
    end)
  end
end
Users.List.run

然后我从我的项目根目录中使用
mix-run-priv/repo/users.list.exs

作为
Jason Harrelson
的补充:还需要启动
Postgrex
Ecto

[:postgrex, :ecto]
|> Enum.each(&Application.ensure_all_started/1)

MyApp.Repo.start_link
更新:

另一种方法是使用混合任务启动应用程序:

Mix.Task.run "app.start", []

非常感谢。这就是我错过的!自Ecto 2.0以来,
的arity已从1更改为2。第二个参数是关键字列表。我们应该将行
sure_started(repo)
更改为
sure_started(repo,[])
。警告:您不应该
导入Mix.exto
,因为它是一个私有API,现在已在Ecto 3.0中被破坏:@JasonAxelson感谢您指出这一点!我已经更新了我的答案,以解决ecto 3.0