Elixir エンティティのスコア フィールドをインクリメント (またはデクリメント) したい:
class Posting(Entity):
score = Field(Integer, PassiveDefault(text('0')))
def upvote(self):
self.score = self.score + 1
ただし、これは upvote への同時呼び出しでは確実に機能しません。私が思いつくことができる最高のものは、この醜い混乱です(基本的に、SQLAlchemyでSQL UPDATEステートメントを構築します):
def upvote(self):
# sqlalchemy atomic increment; is there a cleaner way?
update = self.table.update().where(self.table.c.id==self.id)
update = update.values({Posting.score: Posting.score + 1})
update.execute()
このソリューションに問題はありますか? 同じことを達成するためのよりクリーンな方法はありますか?
ここで DB ロックを使用することは避けたいと思います。Elixir、SQLAlchemy、Postgres を使用しています。
アップデート
以下は、vonPetrushev のソリューションから派生したバリアントです。
def upvote(self):
Posting.query.filter_by(id=self.id).update(
{Posting.score: Posting.score + 1}
)
これは私の最初のソリューションよりもいくらか優れていますが、現在のエンティティをフィルタリングする必要があります。残念ながら、エンティティが複数のテーブルに分散している場合、これは機能しません。