在混合任务中使用 Ecto
Use Ecto in a mix task
在 Phoenix Framework 应用程序中,我有一个带有字段 name
的模型 Product
。我想创建一个列出所有产品名称的混合任务。
在 Ruby 上 Rails 这将是解决问题的代码:
namespace :list do
desc "List all products"
task products: :environment do
Product.all.each do |product|
puts product.name
end
end
end
在凤凰城,我什至无法从数据库中获取所有产品的列表。这是任务代码:
lib/mix/tasks/list.product.ex
defmodule Mix.Tasks.List.Product do
use Mix.Task
import Mix.Ecto
alias App.Repo
alias App.Product
def run(_args) do
products = Repo.all(Product)
end
end
当我 运行 此任务时,我收到此错误消息:
** (UndefinedFunctionError) function Ecto.Queryable.__using__/1
is undefined or private
在这个混合任务中,我需要做什么才能从数据库中获取所有产品?
在 run
方法的顶部添加 ensure_started(Repo, [])
。您可能还想 import Ecto.Query
一些查询表单。
defmodule Mix.Tasks.List.Product do
use Mix.Task
import Mix.Ecto
import Ecto.Query
alias App.Repo
alias App.Product
def run(_args) do
ensure_started(Repo, [])
products = Repo.all(Product)
end
end
困难的方法:
defmodule Mix.Tasks.MyTask do
use Mix.Task
import Ecto.Query
alias MyApp.Repo
@start_apps [
:postgrex,
:ecto,
:ecto_sql
]
@repos Application.get_env(:my_app, :ecto_repos, [])
def run(args) do
start_services()
# Run Ecto...
stop_services()
end
defp start_services do
Enum.each(@start_apps, &Application.ensure_all_started/1)
Enum.each(@repos, & &1.start_link(pool_size: 2))
end
defp stop_services do
:init.stop()
end
end
或简单的方法 ;)
defmodule Mix.Tasks.MyTask do
use Mix.Task
import Ecto.Query
alias MyApp.Repo
def run(args) do
Mix.Task.run("app.start")
# Run Ecto...
end
end
在 Phoenix Framework 应用程序中,我有一个带有字段 name
的模型 Product
。我想创建一个列出所有产品名称的混合任务。
在 Ruby 上 Rails 这将是解决问题的代码:
namespace :list do
desc "List all products"
task products: :environment do
Product.all.each do |product|
puts product.name
end
end
end
在凤凰城,我什至无法从数据库中获取所有产品的列表。这是任务代码:
lib/mix/tasks/list.product.ex
defmodule Mix.Tasks.List.Product do
use Mix.Task
import Mix.Ecto
alias App.Repo
alias App.Product
def run(_args) do
products = Repo.all(Product)
end
end
当我 运行 此任务时,我收到此错误消息:
** (UndefinedFunctionError) function Ecto.Queryable.__using__/1
is undefined or private
在这个混合任务中,我需要做什么才能从数据库中获取所有产品?
在 run
方法的顶部添加 ensure_started(Repo, [])
。您可能还想 import Ecto.Query
一些查询表单。
defmodule Mix.Tasks.List.Product do
use Mix.Task
import Mix.Ecto
import Ecto.Query
alias App.Repo
alias App.Product
def run(_args) do
ensure_started(Repo, [])
products = Repo.all(Product)
end
end
困难的方法:
defmodule Mix.Tasks.MyTask do
use Mix.Task
import Ecto.Query
alias MyApp.Repo
@start_apps [
:postgrex,
:ecto,
:ecto_sql
]
@repos Application.get_env(:my_app, :ecto_repos, [])
def run(args) do
start_services()
# Run Ecto...
stop_services()
end
defp start_services do
Enum.each(@start_apps, &Application.ensure_all_started/1)
Enum.each(@repos, & &1.start_link(pool_size: 2))
end
defp stop_services do
:init.stop()
end
end
或简单的方法 ;)
defmodule Mix.Tasks.MyTask do
use Mix.Task
import Ecto.Query
alias MyApp.Repo
def run(args) do
Mix.Task.run("app.start")
# Run Ecto...
end
end