Как исправить ошибку: 'NoneType' object is not subscriptable?

Ошибка, которую мне не удаётся исправить в этом коде:

def boi():
    user_name = input('Hero name: ')
    sql.execute(f'SELECT name FROM users WHERE name  = "{user_name}"')
    if sql.fetchone() is None:
        print('Такого логина не существует, переход на регистрацию...')
        reg()
    else:
        villiain_name = input('Enemy Name: ')

        sql.execute(f'SELECT name FROM users WHERE name = "{villiain_name}"')
        hero_attack = sql.execute(f'SELECT damage FROM users WHERE name = "{user_name}"')
        ff = sql.fetchone()
        enemy_attack= sql.execute(f'SELECT damage FROM users WHERE name = "{villiain_name}"')
        dd = sql.fetchone()
        q1 = ff[0]
        q2 = dd[0]
        print(f'Hero atack {q1}')
        print(f'Enemy attack {q2}')
        print('FIGHT!!!')
        sql.execute(f'SELECT hp FROM users WHERE name = "{user_name}"')
        w1 =sql.fetchone()
        sql.execute(f'SELECT hp FROM users WHERE name = "{villiain_name}"')
        w2 = sql.fetchone()
        a1 = w1[0]
        a2 = w2[0]
        hero_hp =sql.execute(f'UPDATE users SET hp = {a1 - q2} WHERE name = "{user_name}"')
        x1 = sql.fetchone()
    
        print(x1[0])

Ошибка появляется в:

print(x1[0])

Ответы (1 шт):

Автор решения: MaxU

SQL Инструкция UPDATE ... предназначена для изменения данных в таблице и она не возвращает никаких данных. Поэтому после ее выполнения в курсоре не будет никаких данных и sql.fetchone() вернет None, который, в свою очередь, нельзя использовать как список.

sql.execute(f'UPDATE users SET hp = {a1 - q2} WHERE name = "{user_name}"')
x1 = sql.fetchone()

Воспроизведение ошибки:

In [323]: x1 = None

In [324]: x1[0]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-324-c91b837e0779> in <module>
----> 1 x1[0]

TypeError: 'NoneType' object is not subscriptable
→ Ссылка