0

嗨,我有一个查询,我需要通过匹配两个值来更新数据库,我使用下面的代码

for i in getDailyGame :
    query2 = "UPDATE  Game_mygame SET game_played = "+str(set_game_played)+" WHERE home_teamID = "+str(i.home_teamID)+ " AND away_teamID = "+str(i.away_teamID)
    cursor2.execute(query2) 

大约有 4000 个条目要更新,但是如果是的话,我可以使用 F 类来更新它需要很长时间,而不是请建议如何使用它,比如

myplayer.objects.update(age=F('age')+0.0192)

谢谢

4

1 回答 1

0

请在执行任何其他操作之前转义您的 SQL。你应该做这个:

query = """
    UPDATE Game_mygame SET game_played = %s
    WHERE home_teamID = %s AND away_teamID = %s
"""
cursor.execute(query, (game_played, home_team_id, away_team_id))

如果有人将恶意的 game_played 值或团队 ID 输入您的系统,这将保护您。游标将负责转义这些值,以便它们可以安全地在 MySQL 中运行。

要回答您的其余问题:不,F 表达式不足以表达您想要做的事情。从根本上讲,它们与您在其中表达的子句相结合,而您想要的是对一堆查询进行 OR 组合:

(team_id_1 = a1 and team_id_2 = a2) OR (team_id_1 = b1 and team_id_2 = b2) OR ...

您可以使用 Q 表达式来表达此查询:

https://docs.djangoproject.com/en/dev/topics/db/queries/#django.db.models.Q

上面的表达式变成:

Q(home_teamID=<a1>, away_teamID=<a2>) | Q(home_teamID=<b1>, home_teamID=<b2>) | ...

请注意,这是成本较高的 MySQL 查询之一。最好的方法可能是一次批量更新 64 个左右。

于 2013-08-12T06:05:47.860 回答