Как я могу обработать неудачу оператора DELETE, чтобы удалить любые строки? - PullRequest
1 голос
/ 09 марта 2019

Я написал этот код для удаления строки из таблицы - но если я введу имя, которого нет в таблице, оно все равно выдаст «Данные успешно удалены»:

n = input("Enter Student name you want to delete:")
try:
    cur.execute('DELETE FROM studentdata WHERE name=?', (n,))
    print("Data Deleted Successfully")
    conn.commit()
except:
    print("No data found with this name: ")

Как я могу справиться с этим правильно?

1 Ответ

1 голос
/ 09 марта 2019

Cursor.execute() вызовет исключение только в случае сбоя оператора SQL, который он пытается выполнить - например:

>>> cur.execute("This is not SQL")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
sqlite3.OperationalError: near "This": syntax error

или

>>> cur.execute("SELECT * FROM nonexistent_table;")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
sqlite3.OperationalError: no such table: nonexistent_table

Допустимый оператор SQL, который правильно ничего не делает, успешно выполнен, не завершился неудачей и поэтому не вызывает исключения. Ваш оператор DELETE является правильным и ничего не делает, если не находит указанное значение для name, поэтому ошибки нет.

Вы можете узнать, сколько строк было затронуто оператором SQL, используя атрибут Cursor.rowcount. Переписав код для использования атрибута, выглядело бы примерно так:

name = input("Enter Student name you want to delete:")
cur.execute('DELETE FROM studentdata WHERE name = ?;', [name])
if cur.rowcount > 0:
    print("Data Deleted Successfully")
    conn.commit()
else:
    print("No data found with this name:", name)

Примечание: я оставил commit() там, где он был в вашем коде ... в зависимости от вашего приложения, возможно, он действительно был перемещен за пределы блока if / else.

...