【发布时间】:2019-05-13 12:21:22
【问题描述】:
如果您需要为混合任务访问数据库 - 您需要手动启动 ecto repo。当我们使用 ecto 2 时,我们有 ensure_started 函数。
所以使用 ecto 2 的自定义 CLI 任务看起来像
defmodule App.Task do
use Mix.Task
import Mix.Ecto
def run(args) do
repos = parse_repo(args)
Enum.each repos, fn repo ->
ensure_repo(repo, args)
ensure_started(repo, []) # was deleted from ecto 3
ensure_started 已从 ecto 3 中删除。我尝试了一些方法,但它们对我不起作用。有人知道 ecto 3 的解决方法吗?
更新
正如@starbelly 提到的ensure_started 已迁移到Mix.EctoSQL,因此我们需要添加额外的import Mix.EctoSQL 以使其工作
defmodule App.Cli.Task do
import Mix.Ecto
import Mix.EctoSQL
def start_ecto do
repos = parse_repo([])
Enum.each(repos, fn repo ->
ensure_repo(repo, [])
{:ok, _pid, _apps} = ensure_started(repo, [])
end)
end
end
【问题讨论】:
-
不会
Application.ensure_all_started/2帮忙吗?喜欢Application.ensure_all_started(Ecto)? -
我试过但没有运气 {:ok, apps} = Application.ensure_all_started(:ecto_sql) IO.inpsect apps [:telemetry, :connection, :db_connection, :decimal, :ecto, :ecto_sql ] 但是一旦我需要进行查询 ** (RuntimeError) 就无法查找 Smd.Repo,因为它没有启动或它不存在 (ecto) lib/ecto/repo/registry.ex:18: Ecto.Repo .Registry.lookup/1 (ecto) lib/ecto/repo/queryable.ex:131: Ecto.Repo.Queryable.execute/4 (ecto) lib/ecto/repo/queryable.ex:18: Ecto.Repo.Queryable .all/3 lib/smd/app/search/sync_es.ex:76:Mix.Tasks.App.SyncEs.sync_all_pages/4