gpt4 book ai didi

mysql - (Ecto.Query.CompileError) 元组只能用于与相同大小的文字元组进行比较。 - 灵药

转载 作者:行者123 更新时间:2023-11-29 09:36:59 25 4
gpt4 key购买 nike

我在哪里

对于此示例,请考虑 Friends.repo

Person具有字段:id:name:age

Ecto 查询示例:

iex> from(Friends.Person 中的 x,其中:[{1,10}, {2, 20}, {1, 30}] 中的 {x.id, x.age},选择: [:名称])

当我运行这个时,我得到了相关结果。像这样的东西:

[
%{name: "abc"},
%{name: "xyz"}
]

但是当我尝试插入查询时它会抛出错误

iex> list = [{1,10}, {2, 20}, {1, 30}]
iex> from(x in Friends.Person, where: {x.id, x.age} in ^list, select: [:name])
** (Ecto.Query.CompileError) Tuples can only be used in comparisons with literal tuples of the same size

我假设我需要对 list 变量进行某种类型转换。文档 here 中提到了它:“在插值时,您可能需要明确告诉 Ecto 被插值的预期类型是什么

我需要什么

对于这样的复杂类型,我如何实现这一点?如何为“元组列表,每个大小为 2”键入强制转换?像 [{:integer, :integer}] 这样的东西似乎不起作用。

如果不是上述情况,还有使用 Ecto Query 运行 WHERE (col1, col2) in ((val1, val2), (val3, val4), ...) 类型查询的替代方法?

最佳答案

不幸的是,该错误应按照错误消息中所述进行处理:only literal tuples are supported .

我无法想出一些更优雅、更不易脆弱的解决方案,但我们总是把大锤作为最后的手段。这个想法是生成并执行原始查询。

list = [{1,10}, {2, 20}, {1, 30}]
#⇒ [{1, 10}, {2, 20}, {1, 30}]
values =
Enum.join(for({id, age} <- list, do: "(#{id}, #{age})"), ", ")
#⇒ "(1, 10), (2, 20), (1, 30)"


Repo.query(~s"""
SELECT name FROM persons
JOIN (VALUES #{values}) AS j(v_id, v_age)
ON id = v_id AND age = v_age
""")

如果成功,上面的内容应该返回 {:ok, %Postgrex.Result{}} 元组。

关于mysql - (Ecto.Query.CompileError) 元组只能用于与相同大小的文字元组进行比较。 - 灵药,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57401639/

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