Попробуйте / за исключением не работает при получении из базы данных SQLite - PullRequest
0 голосов
/ 30 апреля 2019

Я создаю приложение, которое извлекает различные атрибуты из файла XML в моем экспорте из библиотеки iTunes. Поскольку не у каждой песни есть жанр, поиск одной песни не всегда будет работать. Когда программа вставляет жанр в «Жанр», она создает автоматический идентификатор

CREATE TABLE Genre (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    name TEXT UNIQUE
);

Дело в том, что, когда в XML-файле не найдено «Жанр», ничего не вставляется, то есть я не могу позже извлечь идентификатор, созданный добавлением чего-либо, чтобы поместить его в табе для выполнения реляционных запросов. Чтобы остановить это, я помещаю вставку и выбираю внутри try /, за исключением того, что будет ловить

TypeError: 'NoneType' object is not subscriptable

ошибка при невозможности

cur.fetchone()[0]

. За исключением того, что я установил жанр «Нет жанра», чтобы сгенерировать уникальный идентификатор для случая, когда жанр не был найден. Это, хотя и ловит исключение в блоке try, не работает. Ошибка:

TypeError                                 Traceback (most recent call last)
~\Documents\python\tracks.py in <module>
     83         cur.execute('SELECT id FROM Artist WHERE name = ? ', (genre, ))
---> 84         genre_id = cur.fetchone()[0]
     85     except:

TypeError: 'NoneType' object is not subscriptable

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
~\Documents\python\tracks.py in <module>
     87         cur.execute('''INSERT OR IGNORE INTO Genre (name) VALUES ( ? )''', ( genre, ) )
     88         cur.execute('SELECT id FROM Artist WHERE name = ? ', (genre, ))
---> 89         genre_id = cur.fetchone()[0]
     90 
     91 

TypeError: 'NoneType' object is not subscriptable 

Помощь! Почему не работает / не работает?

    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:
        genre = "No Genre"
        cur.execute('''INSERT OR IGNORE INTO Genre (name) VALUES ( ? )''', ( genre, ) )
        cur.execute('SELECT id FROM Artist WHERE name = ? ', (genre, ))
        genre_id = cur.fetchone()[0]

1 Ответ

0 голосов
/ 30 апреля 2019

Хорошо, сначала решение

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 выводится на экран, где произошла ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...