Peewee 原子更新复杂逻辑
Peewee atomic updates complex logic
我需要为整个用户更新字段 table。 docs 中指出我不应遍历所有 table 记录。但是要计算一个新的字段值,我需要使用循环、用户关系和其他依赖于具体模型的复杂逻辑来执行计算。
我试图将此计算包含在模型的 属性 中,但我得到:
peewee.InterfaceError: Error binding parameter 0 - probably unsupported type.
原子更新:
query = User.update(balance=(User.balance + User.partners_reward))\
.where(User.deposit >= 3)
型号:
class User(peewee.Model):
deposit = peewee.DecimalField(default=0)
balance = peewee.DecimalField(default=0)
@property
def partners(self):
query = (
User.select(User, Partnership)
.join(Partnership, JOIN.INNER, on=Partnership.invited)
.where(Partnership.referral == self.id)
)
partners = query.execute()
return partners
@property
def partners_reward(self):
partners = self.partners
sum_reward = 0
partner_reward = 0.02
for partner in partners:
reward = partner.deposit * partner_reward
sum_reward += reward
return sum_reward
道具说明:
每个用户都有合作伙伴(他邀请的其他用户),并根据他们获得奖金。因此,为了完成更新,我需要使用关系收集用户合作伙伴,然后使用循环计算实际奖金。
将 属性 更改为一种方法可以解决此问题,但我不知道如何才能访问具体的用户实例。
那么一些复杂的逻辑如何在原子更新中实现,或者我应该使用不推荐的循环来实现?
您可以使用子查询。如果我对你的查询示例理解正确的话,它只是每个合作伙伴存款的总和 * .02?
subq = (Partnership
.select(fn.COALESCE(fn.SUM(Partnership.deposit * .02)))
.where(Partnership.referral == User.id))
res = (User
.update(reward=subq)
.execute())
上面的查询所做的是,对于每个用户,它选择与该用户关联的所有伙伴关系行,并将伙伴关系存款* .02 相加并将结果存储在用户的 "reward" 列中(假设存在这样的专栏)。 "COALESCE()"位是为了处理用户没有伙伴的情况,从而return0而不是null。
如果您希望增加用户的余额:
subq = (Partnership
.select(fn.COALESCE(fn.SUM(Partnership.deposit * .02)))
.where(Partnership.referral == User.id))
res = (User
.update(balance=User.balance + subq)
.execute())
我需要为整个用户更新字段 table。 docs 中指出我不应遍历所有 table 记录。但是要计算一个新的字段值,我需要使用循环、用户关系和其他依赖于具体模型的复杂逻辑来执行计算。
我试图将此计算包含在模型的 属性 中,但我得到:
peewee.InterfaceError: Error binding parameter 0 - probably unsupported type.
原子更新:
query = User.update(balance=(User.balance + User.partners_reward))\
.where(User.deposit >= 3)
型号:
class User(peewee.Model):
deposit = peewee.DecimalField(default=0)
balance = peewee.DecimalField(default=0)
@property
def partners(self):
query = (
User.select(User, Partnership)
.join(Partnership, JOIN.INNER, on=Partnership.invited)
.where(Partnership.referral == self.id)
)
partners = query.execute()
return partners
@property
def partners_reward(self):
partners = self.partners
sum_reward = 0
partner_reward = 0.02
for partner in partners:
reward = partner.deposit * partner_reward
sum_reward += reward
return sum_reward
道具说明:
每个用户都有合作伙伴(他邀请的其他用户),并根据他们获得奖金。因此,为了完成更新,我需要使用关系收集用户合作伙伴,然后使用循环计算实际奖金。
将 属性 更改为一种方法可以解决此问题,但我不知道如何才能访问具体的用户实例。
那么一些复杂的逻辑如何在原子更新中实现,或者我应该使用不推荐的循环来实现?
您可以使用子查询。如果我对你的查询示例理解正确的话,它只是每个合作伙伴存款的总和 * .02?
subq = (Partnership
.select(fn.COALESCE(fn.SUM(Partnership.deposit * .02)))
.where(Partnership.referral == User.id))
res = (User
.update(reward=subq)
.execute())
上面的查询所做的是,对于每个用户,它选择与该用户关联的所有伙伴关系行,并将伙伴关系存款* .02 相加并将结果存储在用户的 "reward" 列中(假设存在这样的专栏)。 "COALESCE()"位是为了处理用户没有伙伴的情况,从而return0而不是null。
如果您希望增加用户的余额:
subq = (Partnership
.select(fn.COALESCE(fn.SUM(Partnership.deposit * .02)))
.where(Partnership.referral == User.id))
res = (User
.update(balance=User.balance + subq)
.execute())