Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2020 14:32:04

Yaroslam322
Зарегистрирован: 2020-02-24
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменить данные в БД

Есть функция, которая принимает на вход два значения: название счета, количество денег, которые надо списать. Счет представляет из себя строку в БД. Проблема заключается в том, что мне выдается ошибка TypeError: unsupported operand type(s) for -=: ‘NoneType’ and ‘int’ Как это исправить?

     def minus_money_on_acc(self, summ, account_name): #редактирование счета
        current_money = self.a.execute('''SELECT money FROM account WHERE name = ?''', (account_name,)).fetchone()
        current_money -= int(summ)
        self.a.execute('''UPDATE account SET money = ? WHERE name = ?''', (current_money,account_name))
        self.account.commit()

Пробовал еще делать так, но тогда просто ничего не происходит

    def minus_money_on_acc(self, summ, account_name): #редактирование счета
        self.a.execute('''UPDATE account SET money = money - ? WHERE name = ?''', (summ,account_name))
        self.account.commit()

Отредактировано Yaroslam322 (Фев. 27, 2020 14:33:12)

Офлайн

#2 Фев. 27, 2020 15:50:37

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Изменить данные в БД

что мне выдается ошибка TypeError: unsupported operand type(s) for -=: ‘NoneType’ and ‘int’ Как это исправить?
Судя по всему это происходит в строке
 current_money -= int(summ)
т.е. в базе нет ничего (None), а ты от этого ничего пытаешься отнимать некую summ.
Видимо надо писать как-то так:
      def minus_money_on_acc(self, summ, account_name): #редактирование счета
        current_money = self.a.execute('''SELECT money FROM account WHERE name = ?''', (account_name,)).fetchone()
        try:
            current_money -= int(summ)
            self.a.execute('''UPDATE account SET money = ? WHERE name = ?''', (current_money,account_name))
            self.account.commit()
        except TypeError:
            pass
Ну или вместо pass присваивать туда некое значение (например, 0).



Офлайн

#3 Фев. 27, 2020 16:23:17

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Изменить данные в БД

Striver
Видимо надо писать как-то так:
Так не надо писать никогда.
Управление потоком выполнения программы с помощью try/except - практика убогая.



Офлайн

#4 Фев. 27, 2020 22:02:03

Yaroslam322
Зарегистрирован: 2020-02-24
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменить данные в БД

Striver
Проблема в том, что в базе есть записи и я вполне себе могу их вывести

Офлайн

#5 Фев. 28, 2020 06:47:36

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Изменить данные в БД

Надо самому себе ответить на вопрос: “Откуда в строке current_money -= int(summ) берётся summ”?
Далее в настройках таблицы включить значение по умолчанию “ноль” для этой колонки и запретить значения типа Null.
Если нет возможности внести правки в БД, то необходимо проверять полученное значение summ на None, до выполнения суммирования, и присваивать переменной 0, если его значение None или пропускать суммирование.

Отредактировано Rafik (Фев. 28, 2020 06:58:31)

Офлайн

#6 Фев. 28, 2020 21:04:05

Yaroslam322
Зарегистрирован: 2020-02-24
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменить данные в БД

Проблема решилась сама собой. Во-первых, я не правильно вставлял данные при вызове функции. Во-вторых, .fetchone() возвращает тип tuple, который не может менять свои значения.

Вот правильный код

     def minus_money_on_acc(self, summ, account_name): #редактирование счета
        self.a.execute('''UPDATE account SET money = money - ? WHERE name = ?''', (summ, account_name))
        self.account.commit()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version