11

DB から Ecto を介してカスタム ミックス タスクでデータを表示したいと考えています。タスクで Ecto リポジトリを取得 (または開始) するにはどうすればよいですか?

私はこのようなことを試しましたが、うまくいきませんでした:

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

この問題を解決するためのアイデアや他の方法はありますか?

4

4 に答える 4

2

リポジトリを使用する前に、リポジトリが開始されていることを確認する必要があります

MyApp.Repo.start_link
于 2016-07-06T14:05:03.767 に答える
0

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、プロジェクトのルートから実行します。

于 2016-07-06T15:18:05.333 に答える