@val1n0r

Как инкрементировать переменную в бд?

Собственно есть проблема,учу django пишу игру на нем же
Хотелось бы реализовать таймер с записью в бд.

Опишу вкратце:
Есть параметр - "энергия", хранится в бд(от 0 до 100)

Мне нужно каждую минуту добавлять +1 в бд, вплоть до 100
Если юзер потратит энергию - снова запускать восстановление

Пока вижу код работы так:

get_energy = UserAttribute.objects.filter(user_id=uid).only('energy')
        for i in get_energy:
            if i.energy < 100:
                # именно тут нужен таймер который будет каждую минуту записывать в бд значение


Нашел такой скрипт на PHP
<?
# восстановление бенза
$currentDate = time();
$dateDiff = $currentDate - $user['fuel_time'];
$newFuel = $user['fuel'];
    //30000 сек - время полной заправки...
if ($dateDiff < 30000 && $newFuel < $user['max_fuel'])
{
	while ($dateDiff > 300){
		$newFuel++;
	if ($newFuel >= $user['max_fuel'])
	{
	break;

}


$dateDiff = $dateDiff - 300; //300 сек == 5 мин
}
}
else
{
$newFuel = $user['max_fuel'];
}
if ($newFuel != $user['fuel'])
{
mysql_query("UPDATE `user` SET `fuel`='$newFuel', `fuel_time`= '$currentDate' WHERE id='".$user['id']."'");
}

?>

Мне нужен такой же принцип работы
  • Вопрос задан
  • 157 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Realmixer
Full stack Python (Django) web-developer
Лучше стараться уходить от циклов в коде, если есть возможность выполнить анализ данных и их изменение на уровне базы данных за минимум транзакций (хотя разумеется есть исключения):

from django.db.models import F

UserAttribute.objects.filter(energy__lt=100).update(energy=F('energy') + 1)

Здесь выполнится два sql-запроса:
  1. Первый отберёт нужные экземпляры UserAttribute.
  2. Второй выполнит добавление единицы к energy у каждого экземпляра. Причём произойдёт это за один запрос. Причём база выполнит команду "добавь к имеющемуся energy единицу" вместо "запиши в energy 42".

Вариант же с отдельными операциями "запрос / анализ / обновление" допускает возникновение ошибочных данных, когда в промежутке между операциями кто-то другой тоже обновит данные. Тогда кто последний сделает запись — то значение и будет в БД.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы