您可以使用底层 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 模式。