Peewee可以让你使用原子性更新。比如我们需要更新一些计数器。直接的方法是:
>>> for stat in Stat.select().where(Stat.url == request.url): ... stat.counter += 1 ... stat.save()
不要这样做!不仅速度很慢,而且容易冲突如果多进程同时在更新这个计数器时。
应该用update方法原子性的更新计数器
>>> query = Stat.update(counter=Stat.counter + 1).where(Stat.url == request.url) >>> query.execute()
可以尽可能复杂的查询语句。我们将我们雇员的奖金修改为旧奖金加上工资的1成:
>>> query = Employee.update(bonus=(Employee.bonus + (Employee.salary * .1))) >>> query.execute() # Give everyone a bonus!
我们可以使用子查询去更新某列的值。假如我们有一个存储User模型某个user tweets数量的字段,我们想要阶段性的更新它的值:
>>> subquery = Tweet.select(fn.COUNT(Tweet.id)).where(Tweet.user == User.id) >>> update = User.update(num_tweets=subquery) >>> update.execute()