“锁定行”;更新「;使用Exto/Elixir的特定表格
我想使用“锁定行”;更新「;使用Exto/Elixir的特定表格,elixir,ecto,Elixir,Ecto,我想使用获取一个锁,用于更新表名。与更新的相比,更新的仅锁定指定表中的行,并且连接的行不被阻止。然而,当我尝试使用下面的代码片段使用EXTO时,它失败了 query = Call |> join_other_tables() # custom methods |> Query.lock("FOR UPDATE OF calls") 原因是,Ecto使用别名进行调用,例如,c0,这意味着我还必须在锁表达式中使用别名才能使其工作 query = Call |>
获取一个锁
,用于更新表名
。与更新的相比,
更新的仅锁定指定表中的行,并且连接的行不被阻止。然而,当我尝试使用下面的代码片段使用EXTO时,它失败了
query =
Call
|> join_other_tables() # custom methods
|> Query.lock("FOR UPDATE OF calls")
原因是,Ecto使用别名进行调用
,例如,c0
,这意味着我还必须在锁表达式中使用别名才能使其工作
query =
Call
|> join_other_tables() # custom methods
|> Query.lock("FOR UPDATE OF c0")
使用别名看起来不是一种正确的方法。是否有其他方法使其工作?自exto v3
起,无法将参数化值传递给Query.lock
。它接受
[命名绑定]也无法工作,因为exto
内部
下面的方法是最接近的方法,但也不起作用,因为exto.Query.lock/2
不允许插值
使用具有插值功能的关键字查询语法。有点像:
from c in Call,
join: ..., # custom methods
lock: fragment("FOR UPDATE OF ?", c)
这会引发下一个错误:fragment(“FOR UPDATE OF?”,c)不是有效的锁。出于安全原因,锁必须始终是文本字符串
Damn,它们只允许二进制文件。那你可以试试。如果成功,请告诉我,我将更新或删除答案。不幸的是,这也不起作用。看起来Ecto在内部使用了这些别名,但在实际的SQL查询中使用了它。是的,生成器是私有的。很抱歉这么说,但听起来你是在做最后的选择:“c0”
硬编码。我将删除答案。或者添加一个更新的答案,目前没有办法做到这一点,作为版本的外星版本3。