我在postgreSQL上有一个set return函数,例如
CREATE FUNCTION set_ret_func(foo int, bar int)
RETURNS TABLE(total bigint, result bigint) AS $$
SELECT a.val + $1 as total, b.val + $2 as result
FROM a, b
$$ LANGUAGE SQL;
这个功能为我提供了一个“灵活的视图”,我可以轻松地称之为:
SELECT * from set_ret_func('30'::int, '89'::int)
环顾四周我发现多态关联可以通过Ecto.Repo来调用
from( x in {"table_name", Model}, select: x.total )
|> Repo.all
这让我想知道我是否可以在from / 2中使用Ecto.Query或Ecto.Query.API中的片段/ 1,这样我就可以将我的set return函数调用到Schema中(它们都匹配在column_name上,键入)根据我的想象看起来像是:
from( srf in {fragment("set_ret_func(?::int, ?::int)", var1, var2), Model},
select: srf.total)
是否有实际的方法来调用此STR并将其转换为模型?
答案 0 :(得分:1)
老实说,最简单的方法是Ecto.Adapters.SQL.query
。您仍然可以将其加载到模型中。这是一个应该大致正确的快速摘录:
with {:ok, %{columns: cols, rows: rows}} <- Ecto.Adapters.SQL.query(Repo, "SELECT * FROM set_rec_func(?,?)", [var1, var2])
fields = Enum.map(cols, &String.to_existing_atom/1) do
for row <- rows, values = Enum.zip(fields, rows) do
struct(Model, values) |> Ecto.put_meta(state: :loaded)
end
end
虽然这并不是您的ecto查询尝试做的事情,但这只是选择一个字段而不是整个模型。事实上,在Ecto中发生的模型魔法并不多。所有真正的魔力都发生在Ecto.Query API和Ecto.Changeset API中。事实上,为了防止将来出现混淆,Ecto 2.0(几天之内)正在放弃&#34; Model&#34;完全的话。它们只是与某些模式元数据绑定的正常结构。