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 通信。