Elixir Ecto.Schema error: __schema__/1 undefined
Elixir Ecto.Schema error: __schema__/1 undefined
我目前正面临一个我无法理解的错误——它是某种事物的征兆,但我从概念上不知道它可能是什么。这是我认为的相关代码。
在我的模型定义中,我有:
defmodule EventBridge.Event do
use Ecto.Schema
use Timex.Ecto.Timestamps
import Ecto
import Ecto.Changeset
alias Timex.Parse.DateTime.Parser
schema "events" do
field :occurred_at, Timex.Ecto.DateTime
field :action, :string
field :source_application, :string
field :athlete_id, :integer
field :coach_id, :integer
field :detail, :string
field :deleted, :integer, default: 0
field :deleted_at, Timex.Ecto.DateTime
field :partner_name, :string, default: "Source Partner 1"
field :coach_email, :string
field :coach_first_name, :string
field :coach_last_name, :string
field :coach_position, :string
field :college_name, :string
field :athlete_email, :string
field :athlete_first_name, :string
field :athlete_last_name, :string
field :coach_sport, :map, default: %{}
field :athlete_sport, :map, default: %{}
end
...
end
这里是报错的地方:
defmodule EventBridge.Migrate.ProducerConsumer do
use GenStage
import Ecto.Query
import Ecto.Changeset
import Ecto.Query, only: [from: 1, from: 2]
alias EventBridge.CoachActivityRepo
alias EventBridge.Event
alias EventBridge.C3poEvent
alias EventBridge.SportsMap
alias EventBridge.TimeUtils
def start_link do
GenStage.start_link(__MODULE__, :state_doesnt_matter, name: __MODULE__)
end
def init(number) do
{:producer_consumer, number}
end
def handle_events(events, _from, number) do
changesets = Enum.map(events, fn(event) ->
transform_event(event)
end)
|> List.flatten()
{:noreply, changesets, number}
end
#==========
defp transform_event(%C3poEvent{action: "search appearance"} = c3po_event), do: search_appearance_event(c3po_event)
defp transform_event(%C3poEvent{action: "view"} = c3po_event), do: view_event(c3po_event)
defp transform_event(c3po_event), do: nil
#==========
defp single_event(c3po_event) do
...
end
defp search_appearance_event(c3po_event) do
counter = real_count(c3po_event)
case counter do
x when x > 0 ->
create_search_appearance_events(c3po_event, counter, [])
x when x < 0 ->
delete_search_appearance_events(c3po_event, counter)
_ ->
[]
end
end
defp delete_search_appearance_events(c3po_event, counter) do
from(t in CoachActivityRepo, # ERROR FROM HERE
where: t.athlete_id == ^c3po_event.athlete_id,
where: t.coach_id == ^c3po_event.coach_id,
where: t.action == 'search appearance',
order_by: [desc: t.occurred_at],
limit: ^counter,
offset: 0)
|> CoachActivityRepo.delete_all
[]
end
defp create_search_appearance_events(c3po_event, counter, accumulator) do
...
end
defp shifted_datetime(days) do
...
end
defp view_event(c3po_event) do
...
end
defp convert_event_parameters(c3po_event, occurred_at) do
...
end
defp convert_event_parameters(c3po_event) do
...
end
defp real_count(c3po_event) do
c3po_event - from(t in CoachActivityRepo, # ERROR FROM HERE
select: count(t.id),
where: t.athlete_id == ^c3po_event.athlete_id,
where: t.coach_id == ^c3po_event.coach_id,
where: t.action == 'search appearance')
end
end
这是 Repo 定义:
defmodule EventBridge.CoachActivityRepo do
use Ecto.Repo, otp_app: :event_bridge
end
我怀疑这些信息太多了。我不是在这里寻找正确的代码,我主要想知道是否有人可以描述在使用模型的情况下导致原始错误的原因。做我的
Ecto 查询适用于内部带有 Ecto.Schema 的模块,而不适用于 Ecto.Repo。
您应该按照以下步骤操作:
from e in EventBridge.Event...
Repo 只是一个模块,通过 DB 引擎的适配器与 DB 通信。
我目前正面临一个我无法理解的错误——它是某种事物的征兆,但我从概念上不知道它可能是什么。这是我认为的相关代码。
在我的模型定义中,我有:
defmodule EventBridge.Event do
use Ecto.Schema
use Timex.Ecto.Timestamps
import Ecto
import Ecto.Changeset
alias Timex.Parse.DateTime.Parser
schema "events" do
field :occurred_at, Timex.Ecto.DateTime
field :action, :string
field :source_application, :string
field :athlete_id, :integer
field :coach_id, :integer
field :detail, :string
field :deleted, :integer, default: 0
field :deleted_at, Timex.Ecto.DateTime
field :partner_name, :string, default: "Source Partner 1"
field :coach_email, :string
field :coach_first_name, :string
field :coach_last_name, :string
field :coach_position, :string
field :college_name, :string
field :athlete_email, :string
field :athlete_first_name, :string
field :athlete_last_name, :string
field :coach_sport, :map, default: %{}
field :athlete_sport, :map, default: %{}
end
...
end
这里是报错的地方:
defmodule EventBridge.Migrate.ProducerConsumer do
use GenStage
import Ecto.Query
import Ecto.Changeset
import Ecto.Query, only: [from: 1, from: 2]
alias EventBridge.CoachActivityRepo
alias EventBridge.Event
alias EventBridge.C3poEvent
alias EventBridge.SportsMap
alias EventBridge.TimeUtils
def start_link do
GenStage.start_link(__MODULE__, :state_doesnt_matter, name: __MODULE__)
end
def init(number) do
{:producer_consumer, number}
end
def handle_events(events, _from, number) do
changesets = Enum.map(events, fn(event) ->
transform_event(event)
end)
|> List.flatten()
{:noreply, changesets, number}
end
#==========
defp transform_event(%C3poEvent{action: "search appearance"} = c3po_event), do: search_appearance_event(c3po_event)
defp transform_event(%C3poEvent{action: "view"} = c3po_event), do: view_event(c3po_event)
defp transform_event(c3po_event), do: nil
#==========
defp single_event(c3po_event) do
...
end
defp search_appearance_event(c3po_event) do
counter = real_count(c3po_event)
case counter do
x when x > 0 ->
create_search_appearance_events(c3po_event, counter, [])
x when x < 0 ->
delete_search_appearance_events(c3po_event, counter)
_ ->
[]
end
end
defp delete_search_appearance_events(c3po_event, counter) do
from(t in CoachActivityRepo, # ERROR FROM HERE
where: t.athlete_id == ^c3po_event.athlete_id,
where: t.coach_id == ^c3po_event.coach_id,
where: t.action == 'search appearance',
order_by: [desc: t.occurred_at],
limit: ^counter,
offset: 0)
|> CoachActivityRepo.delete_all
[]
end
defp create_search_appearance_events(c3po_event, counter, accumulator) do
...
end
defp shifted_datetime(days) do
...
end
defp view_event(c3po_event) do
...
end
defp convert_event_parameters(c3po_event, occurred_at) do
...
end
defp convert_event_parameters(c3po_event) do
...
end
defp real_count(c3po_event) do
c3po_event - from(t in CoachActivityRepo, # ERROR FROM HERE
select: count(t.id),
where: t.athlete_id == ^c3po_event.athlete_id,
where: t.coach_id == ^c3po_event.coach_id,
where: t.action == 'search appearance')
end
end
这是 Repo 定义:
defmodule EventBridge.CoachActivityRepo do
use Ecto.Repo, otp_app: :event_bridge
end
我怀疑这些信息太多了。我不是在这里寻找正确的代码,我主要想知道是否有人可以描述在使用模型的情况下导致原始错误的原因。做我的
Ecto 查询适用于内部带有 Ecto.Schema 的模块,而不适用于 Ecto.Repo。
您应该按照以下步骤操作:
from e in EventBridge.Event...
Repo 只是一个模块,通过 DB 引擎的适配器与 DB 通信。