【问题标题】:use F for referencing 2 tables to update python使用 F 引用 2 个表来更新 python
【发布时间】:2013-08-08 04:43:54
【问题描述】:

您好,我有一个脚本,它使用 2 或 3 个表来引用来更新数据库中的数据

下面是代码

getteam  = myteam.objects.only("id")  # [:2] limits the query to 2 just for testing
for i in getteam:
     gettraining = training.objects.get(teamID=i.id)    # because for now the traning table is empty

     getPrimary =  gettraining.primary
     if getPrimary  == 1 or getPrimary == 0 :
         getteamPlayers =  teamPlayers.objects.filter(teamId=i.id)
         for t in getteamPlayers :
             getmyplayer= myplayer.objects.get(id=t.playerId)
             getPlayerAge = getmyplayer.age     
             increase = max(0, (1+((MIDAGE - getPlayerAge) * MULTIPLIER) / 100) * 0.05 / 9)
             getvitals = vitals.objects.get(playerID=t.playerId)
             getvitals.velocity = min(max(getvitals.velocity + increase,0),1)  
             getvitals.power = min(max(getvitals.power + increase,0),1)  
             getvitals.arm = min(max(getvitals.arm + increase,0),1)  
             getvitals.ranges = min(max(getvitals.ranges + increase,0),1)  
             getvitals.save()
             print t.playerId

我在终端上运行这个脚本,我想使用 f 类或更新之类的东西,因为更新需要很长时间,你能建议我如何使用或提高插入时间的速度

【问题讨论】:

  • 你能展示一下相关的模型吗?我敢打赌,只需使用 select_related() 加载您需要的模型并使用 1-3 个查询,而不是每个团队 4 个查询,就会显着加快速度。

标签: python mysql django performance updatemodel


【解决方案1】:

在单个事务中运行更新函数可以显着提升性能。

详情请查看Django database transaction management。 您可以考虑使用可用作上下文管理器的django.db.transaction.commit_on_success

from django.db import transaction


with transaction.commit_on_success():
    # your code here

或作为函数装饰器:

from django.db import transaction


@transaction.commit_on_success
def update_function():
    # your code here

【讨论】:

  • 这无济于事。现有代码每个循环执行 4 个查询加上保存。这就是瓶颈所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多