2013-08-12 2 views
0

Привет У меня есть запрос, в котором мне нужно обновить базу данных путем сопоставления двух значений для этого я использую приведенный ниже кодиспользование F для обновления с тем, где в Python

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) 

благодаря

+2

Пожалуйста, избегайте своего SQL, прежде чем делать что-либо еще. Вы должны сделать это: – disatisfieddinosaur

+0

Не смог подобрать то, что я хотел сказать в комментарии. – disatisfieddinosaur

ответ

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 или идентификаторы команды в вашу систему. Курсор позаботится о том, чтобы избежать этих значений, чтобы они были безопасны для запуска в 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 или около того за раз.

Смежные вопросы