Elixir 使用自定义sql而不是表返回一个EXTO模型

Elixir 使用自定义sql而不是表返回一个EXTO模型,elixir,ecto,Elixir,Ecto,在这种情况下,我使用一些自定义sql生成一个中间表。在我的应用程序中,我有一个指向中间表的模型。我有一个不使用中间表的要求,所以我试图弄清楚如何编写一个Ecto模型,以便它在为该模型加载数据时使用自定义sql 重要提示:此模型仅用于读取该表或sql select结果,因此我不必支持insert/update/delete。这将大大简化我的工作 以下是一个假模型,用于我想做的事情: defmodule EventBridge.C3poEvent do use Ecto.Schema imp

在这种情况下,我使用一些自定义sql生成一个中间表。在我的应用程序中,我有一个指向中间表的模型。我有一个不使用中间表的要求,所以我试图弄清楚如何编写一个Ecto模型,以便它在为该模型加载数据时使用自定义sql

重要提示:此模型仅用于读取该表或sql select结果,因此我不必支持insert/update/delete。这将大大简化我的工作

以下是一个假模型,用于我想做的事情:

defmodule EventBridge.C3poEvent do
  use Ecto.Schema
  import Ecto
  import Ecto.Query, only: [from: 1, from: 2]

  schema intermediate_table_name do
    field :id, :integer
    field :access_dates, :string
    field :action, :string                 
    field :counter, :integer
  end
end
让我们假设使用以下sql来获取数据:

select id, access_dates, action, counter from some_other_table 
  where some_conditions = true;
我需要能够做的是使用该sql加载模型,而不是从我的示例所支持的表加载模型

在我的脑海中,我想在模型中加入一个函数,如:

def get_model(Model, some_conditions) do
  ...
end
在该函数中,只需手动加载包含sql的模型。但我不相信这是有意义的,或者b会产生一个我可以用来访问字段的模型

也许我甚至不应该使用模型?只是一个自定义结构,其中包含get_model方法,并且不用担心用模式来支持它


同样,请不要告诉我,我只是在阅读这些数据。

如果我正确理解您的需要,您只需要一种“升级”的结构。这是很容易实现的。我将提供一个从我的生产代码中采用的示例,显示验证和其他Ecto优点:

defmodule EventBridge.C3poEvent do 使用exto.Schema 导入外部变更集 @必填字段~w | id访问日期操作| @字段[计数器|@必填字段] @主键错误 嵌入式模式 字段:id,:整数 字段:访问日期,:字符串 字段:action,:string 字段:计数器,:整数 终止 def newdata_mapdata何时开始 %__模块{{} |>castdata,@字段不受外部影响 |>证实_required@required_fields无异位 |>应用不受外部影响的更改 终止 `到\u字符串`/插值支持 定义String.Chars,用于:EventBridge.C3poEvent do 定义要做的事情
图式是完美的生活,没有任何真正的桌子在后面;我经常使用exto.Schema来方便地验证结构。除此之外,我不确定我是否了解问题所在。您是否需要它完全符合EXTO,以便在复杂查询中使用它?不,我只需要能够加载一组行并像访问任何结构一样访问它们。例如mystruct.id,我想知道我是否只是创建了一个与EXTO模型/模式机制无关的结构,并且有一个执行sql并将其映射到结构中的方法,如果不使用实际的表来支持模型模式,那么模型模式的代码是什么样子的?如果希望模式不使用表来支持,那么可以使用嵌入式_模式