【问题标题】:Convert sql query to Ecto query将 sql 查询转换为 Ecto 查询
【发布时间】:2020-06-18 01:08:36
【问题描述】:

我有一个sql查询如下

select username, email, nickname, lastname, firstname, phone 
 from a
 where NOT EXISTS
 (
 select b.tip_team_id from b
 where b.season_id = 1
 and b.round_id = 2
 and a.id = b.user_id
 );

我想把它转换成 Ecto 查询……有人可以帮我吗?

【问题讨论】:

  • 你有没有尝试过任何东西并卡在某个地方?你有那个表的 Ecto Schema 吗?

标签: elixir ecto


【解决方案1】:

您可以使用底层 adapter 运行原始 SQL 查询,例如

query = """
  select username, email, nickname, lastname, firstname, phone 
  from a
  where NOT EXISTS
  (
    select b.tip_team_id from b
    where b.season_id = $1::integer
    and b.round_id = $2::integer
    and a.id = b.user_id
  )
"""

Ecto.Adapters.SQL.query!(MyApp.Repo, query, [1, 2])

请注意,Ecto.Adapters.SQL.query!/3 函数将采用有序参数列表替换您的查询(因此列表中的第一项替换查询中的$1,第二项替换$2,等等) .为了让它工作,你需要传递你定义的Ecto.Repo模块,你指定use Ecto.Repo和你的数据库引擎(上面例子中的MyApp.Repo)。另请注意,如果要替换的值不是整数,则可以省略 ::integer 后缀。

返回的结果将是一个%Postgrex.Result{} 结构,例如

%Postgrex.Result{
   columns: ["username", "email", "nickname", "lastname", "firstname", "phone"],
   command: :select,
   connection_id: 327,
   messages: [],
   num_rows: 1,
   rows: [["admin", "admin@email", "Big Guy", "Jones", "Boss", "888-555-1212"]]
 }

因此,您必须进行一些模式匹配才能从该结构中获取rows 的列表。

有时,像这样简单地使用原始查询比花时间定义 Ecto Schema 模块更容易——这完全取决于您和您的用例,但根据情况和您的偏好,您可能希望这样做以更“标准”的方式为数据库中的每个表定义 Ecto 模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2015-10-10
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2017-04-07
    相关资源
    最近更新 更多