簡體   English   中英

如何使用DBIx :: Class增加列?

[英]How to increment a column using DBIx::Class?

我正在嘗試將一些原始DBI調用轉換為DBIx :: Class。 我偶爾遇到類似的事情:

UPDATE 'foo' SET bar = bar + 1 WHERE ...

有沒有辦法讓DBIx :: Class完全執行這種查詢? 我不想做類似的事情:

$row->update({ bar => $row->bar() + 1 });

因為如果多個進程試圖做同樣的事情,就會出現競爭狀況。

我可以通過在數據庫級別進行某種鎖定來解決這個問題,但這對我來說比使用原始查詢更糟糕。 基本上我只是想知道是否有一種干凈的方式使用DBIC來執行此操作,或者我是否應該繼續在此處繼續使用原始DBI調用。

使用@ ThisSuitIsBlackNot注釋中的解決方案,但將update_all替換為update

$rs->search(...)->update({
    bar => \'bar + 1',
});

這將導致單個UPDATE語句。 (解釋: update_all工作原理是在ResultSet中的每一行上調用update ,包括DBIC觸發器之類的東西,因此它必須首先獲取行.RatesSet上的update執行准系統SQL UPDATE。)

將使用DBIx :: Class :: Storage :: TxnScopeGuard幫助嗎? 您可以將代碼塊包裝在這樣的事務中

my $guard = $schema->txn_scope_guard;
# your increment
$guard->commit;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM