oal*_*ers 6 sql perl dbix-class
我正在尝试将一些原始DBI调用转换为DBIx :: Class.我偶尔遇到类似的事情:
UPDATE 'foo' SET bar = bar + 1 WHERE ...
Run Code Online (Sandbox Code Playgroud)
有没有办法让DBIx :: Class完全执行这种查询?我不想做类似的事情:
$row->update({ bar => $row->bar() + 1 });
Run Code Online (Sandbox Code Playgroud)
因为如果多个进程试图做同样的事情,就会出现竞争状况.
我可以通过在数据库级别进行某种锁定来解决这个问题,但这对我来说比使用原始查询更糟糕.基本上我只是想知道是否有一种干净的方式使用DBIC来执行此操作,或者我是否应该继续在此处继续使用原始DBI调用.
使用 @ThisSuitIsBlackNot 评论中的解决方案,但替换update_all为update:
$rs->search(...)->update({
bar => \'bar + 1',
});
Run Code Online (Sandbox Code Playgroud)
这将产生一个 UPDATE 语句。(说明:通过调用ResultSet 中的每一行来update_all工作,包括 DBIC 触发器之类的东西,因此它必须首先获取行。在 ResultSet 上执行准系统 SQL UPDATE。)updateupdate