gpt4 book ai didi

elixir - 如何将原始 sql 与 ecto Repo 一起使用

转载 作者:行者123 更新时间:2023-12-03 07:03:42 24 4
gpt4 key购买 nike

我有 upsert 需求,因此我需要调用 postgres 存储过程或使用公用表表达式。我还使用 pgcrypto exgtension 作为密码,并希望使用 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.Schem.schema/3 但这失败了

Rocket.User.__schema__(:load,q.rows |> List.first,0)
** (FunctionClauseError) no function clause matching in Rocket.User.__schema__/3

最佳答案

在带有 Postgres 的 Ecto 2.0(测试版)上,您可以使用 Ecto.Adapters.SQL.query() ( current docs2.0-beta2 docs )执行任意 SQL;除了行本身的列表(“rows”)之外,它还返回一个列名称列表(“columns”)。

在下面的例子中,我

  1. 运行不带参数的自定义查询,
  2. 将结果的列名称从字符串转换为原子,并且
  3. 将这些结果与每一行结果组合起来,并将其映射到 Kernel.struct() 的结构中

(您可能需要运行 query() 版本(没有爆炸!)并检查 {ok, res}。)

qry = "SELECT * FROM users"
res = Ecto.Adapters.SQL.query!(Repo, qry, []) # 1

cols = Enum.map res.columns, &(String.to_atom(&1)) # 2

roles = Enum.map res.rows, fn(row) ->
struct(MyApp.User, Enum.zip(cols, row)) # 3
end

关于elixir - 如何将原始 sql 与 ecto Repo 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27751216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com