我有一个upsert需求,需要调用Postgres存储过程或使用公共表达式。我还使用pgcrypto扩展来处理密码,并且希望使用Postgres函数(如“crypt”)来编码/解码密码。
但是我找不到在Ecto中使用部分或全部原始SQL的方法,这意味着Ecto只支持Elixir DSL并且不允许在DSL不足时切换到原始SQL吗?
我发现我可以通过适配器查询(Rocket是应用程序的名称)。
q = Ecto.Adapters.Postgres.query(Rocket.Repo,"select * from users limit 1",[])
但不确定如何将此传递给模型。我新手使用 Elixir,似乎应该能够使用 Ecto.Model.Schema.schema/3,但这会失败。
Rocket.User.__schema__(:load,q.rows |> List.first,0)
** (FunctionClauseError) no function clause matching in Rocket.User.__schema__/3
__schema__(:load, ..., ...)
是否应该直接这样使用有矛盾的感觉...但你的解决方案非常适合当前的代码! - José Valim