Я хотел бы увеличить (или уменьшить) поле оценки в сущности Elixir:
class Posting(Entity):
score = Field(Integer, PassiveDefault(text('0')))
def upvote(self):
self.score = self.score + 1
Однако это не работает надежно при одновременных вызовах upvote.Лучшее, что я могу придумать, - это уродливый беспорядок (в основном, построение оператора SQL UPDATE с помощью SQLAlchemy):
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()
Видите ли вы какие-либо проблемы с этим решением?Есть ли более чистые способы достичь того же?
Я бы хотел не использовать здесь блокировки БД.Я использую Elixir, SQLAlchemy, Postgres.
Обновление
Вот вариант, полученный из решения фонПетрушева:
def upvote(self):
Posting.query.filter_by(id=self.id).update(
{Posting.score: Posting.score + 1}
)
Этонесколько лучше, чем мое первое решение, но все же требует фильтрации для текущей сущности.К сожалению, это не работает, если сущность распределена по нескольким таблицам.