Хорошо, сначала решение
import sqlite3
conn = sqlite3.connect('systeminfo.db')
cur = conn.cursor()
genre = 'test'
try:
cur.execute('''INSERT OR IGNORE INTO Genre (name) VALUES ( ? )''', ( genre, ) )
cur.execute('SELECT id FROM Artist WHERE name = ? ', (genre, ))
genre_id = cur.fetchone()
if genre_id is None:
print('Select did not find any artist for {} genre'.format(genre))
else:
print('Select resulted in Artist ID {}'.format(genre_id[0]))
except Exception as e:
print('Exception: {}'.format(e))
raise Exception(e)
conn.commit()
conn.close()
Видите, есть вероятность, что cur.fetchone()
может привести к строке или None, если строки нет.Итак, давайте сделаем if..then, чтобы проверить None.
Вот что, кажется, происходит.Прокрутите путь внизу поста, чтобы найти ответ.
Таблица
CREATE TABLE Artist (
id integer not null primary key autoincrement,
name text,
genre text
);
CREATE TABLE Genre (
id integer not null primary key autoincrement,
name text unique
);
Данные
sqlite> select * from Artist;
Run Time: real 0.000 user 0.000086 sys 0.000054
sqlite> select * from Genre;
Run Time: real 0.000 user 0.000092 sys 0.000064
sqlite>
В основном нет данных.
Ваш код
import sqlite3
conn = sqlite3.connect('systeminfo.db')
cur = conn.cursor()
genre = 'test'
try:
cur.execute('''INSERT OR IGNORE INTO Genre (name) VALUES ( ? )''', ( genre, ) )
cur.execute('SELECT id FROM Artist WHERE name = ? ', (genre, ))
genre_id = cur.fetchone()[0]
except:
cur.execute('''INSERT OR IGNORE INTO Genre (name) VALUES ( ? )''', ( genre, ) )
cur.execute('SELECT id FROM Artist WHERE name = ? ', (genre, ))
genre_id = cur.fetchone()[0]
conn.commit()
conn.close()
Проблема
Ваши ошибки происходят в 2 местах,В вашем блоке try
ошибка genre_id = cur.fetchone()[0]
.Как только ошибка нажата, управление переходит в блок except
.В этом блоке код повторяется.Это означает, что ошибка повторяется.В этом блоке нет обработки ошибок, потому что это обработка ошибок.Итак, python выдает еще одну ошибку, кроме блока для того же самого genre_id = cur.fetchone()[0]
.
Удалите проблему
import sqlite3
conn = sqlite3.connect('systeminfo.db')
cur = conn.cursor()
genre = 'test'
try:
cur.execute('''INSERT OR IGNORE INTO Genre (name) VALUES ( ? )''', ( genre, ) )
cur.execute('SELECT id FROM Artist WHERE name = ? ', (genre, ))
genre_id = cur.fetchone()[0]
except Exception as e:
print('Exception: {}'.format(e))
conn.commit()
conn.close()
Хорошо.В except
мы хотим обработать исключение и, возможно, распечатать исключение.Итак, мы будем использовать except Exception as e
.Теперь информация об ошибке находится в e
.Мы распечатываем это и все.
$ python myfile.py
Exception: 'NoneType' object is not subscriptable
Но что, если я хочу показать, где ошибка?
Добавить raise Exception(e)
прямо под print('Exception: {}'.format(e))
,Таким образом, результат становится следующим:
$ python myfile.py
Exception: 'NoneType' object is not subscriptable
Traceback (most recent call last):
File "testy.py", line 9, in <module>
genre_id = cur.fetchone()[0]
TypeError: 'NoneType' object is not subscriptable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "testy.py", line 12, in <module>
raise Exception(e)
Exception: 'NoneType' object is not subscriptable
Это утверждение raise
выводится на экран, где произошла ошибка.