python sqlite не возвращает None, хотя это None? - PullRequest
0 голосов
/ 19 февраля 2019

Это задание, которое я должен сделать для онлайн-курса.Мы изучаем моделирование данных и реляционные базы данных.Для этого задания мы должны взять входные данные из файла списка воспроизведения iTunes xml и поместить их в базу данных.Вот код:

import xml.etree.ElementTree as ET
import sqlite3

conn = sqlite3.connect('trackdb14.sqlite')
cur = conn.cursor()

# Make some fresh tables using executescript()
cur.executescript('''
DROP TABLE IF EXISTS Artist;
DROP TABLE IF EXISTS Album;
DROP TABLE IF EXISTS Track;
DROP TABLE IF EXISTS Genre;

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

CREATE TABLE Album (
    id  INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    artist_id  INTEGER,
    title   TEXT UNIQUE
);

CREATE TABLE Track (
    id  INTEGER NOT NULL PRIMARY KEY
        AUTOINCREMENT UNIQUE,
    title TEXT  UNIQUE,
    album_id  INTEGER,
    len INTEGER, rating INTEGER, count INTEGER,
    genre_id INTEGER
);

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

);
''')


fname =('C:/Users/Jeremiah/Desktop/Python/code3/tracks/Library.xml')
#if ( len(fname) < 1 ) : fname = 'Library.xml'

# <key>Track ID</key><integer>369</integer>
# <key>Name</key><string>Another One Bites The Dust</string>
# <key>Artist</key><string>Queen</string>
def lookup(d, key):
    found = False
    for child in d:
        if found : return child.text
        if child.tag == 'key' and child.text == key :
            found = True
    return None

stuff = ET.parse(fname)
all = stuff.findall('dict/dict/dict')
print('Dict count:', len(all))
for entry in all:
    if ( lookup(entry, 'Track ID') is None ) : continue

    name = lookup(entry, 'Name')
    artist = lookup(entry, 'Artist')
    album = lookup(entry, 'Album')
    count = lookup(entry, 'Play Count')
    rating = lookup(entry, 'Rating')
    length = lookup(entry, 'Total Time')
    genre = lookup(entry, 'Genre')
    if name is None or artist is None or album is None :
        continue

    #print(name, artist, album, count, rating, length,genre)


    cur.execute('''INSERT OR IGNORE INTO Artist (name)
        VALUES ( ? )''', ( artist, ) )
    cur.execute('SELECT id FROM Artist WHERE name = ? ', (artist, ))
    artist_id = cur.fetchone()[0]

    cur.execute('''INSERT OR IGNORE INTO Album (title, artist_id)
        VALUES ( ?, ? )''', ( album, artist_id ) )
    cur.execute('SELECT id FROM Album WHERE title = ? ', (album, ))
    album_id = cur.fetchone()[0]

    cur.execute('''INSERT INTO Genre (name)
        VALUES ( ? )''',(genre, ) )
    cur.execute('SELECT id FROM Genre WHERE name = ? ', (genre, ))
    if (cur.fetchone()) is None or (cur.fetchone() is 'None'):
        print('Here')
    else:
        print(cur.fetchone())
    genre_id = None

    #print (name)
    #print(artist)
    #print(genre_id)

    if genre_id is not None:

        cur.execute('''INSERT OR IGNORE INTO Genre (genre_id)
        VALUES (?)''',(genre_id, ))

        cur.execute('''INSERT OR REPLACE INTO Track
            (title, album_id, len, rating, count)
            VALUES ( ?, ?, ?, ?, ? )''',
            ( name, album_id, length, rating, count ) )
        genre_id = None
        conn.commit()
        continue


    else:

        cur.execute('''INSERT OR REPLACE INTO Genre (genre_id)
            VALUES (?)''',(genre, ))

        cur.execute('''INSERT OR REPLACE INTO Track
            (title, album_id, len, rating, count)
            VALUES ( ?, ?, ?, ?, ? )''',
            ( name, album_id, length, rating, count ) )
        #genre_id = None
    conn.commit()
print('done')

Мне нужно положить genre_id в таблицу треков.Но когда я запускаю код, включающий genre_id = cur.fetchone()[0], я получаю ошибку: NoneType is not subscriptable.Итак, я попытался распечатать cur.fetchone(), чтобы увидеть, какие значения вернули None.Я использовал is not None, чтобы попытаться найти значения cur.fetchone(), которые возвращают None, но когда я распечатываю каждое значение cur.fetchone(), оно все равно иногда печатает None.

Как можноЯ отсеял случаи, когда cur.fetchone() это None?

Я застрял на несколько дней.

Заранее спасибо за помощь !!!

Редактировать:

import xml.etree.ElementTree as ET
import sqlite3

conn = sqlite3.connect('trackdb14.sqlite')
cur = conn.cursor()

# Make some fresh tables using executescript()
cur.executescript('''
DROP TABLE IF EXISTS Artist;
DROP TABLE IF EXISTS Album;
DROP TABLE IF EXISTS Track;
DROP TABLE IF EXISTS Genre;

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

CREATE TABLE Album (
    id  INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    artist_id  INTEGER,
    title   TEXT UNIQUE
);

CREATE TABLE Track (
    id  INTEGER NOT NULL PRIMARY KEY
        AUTOINCREMENT UNIQUE,
    title TEXT  UNIQUE,
    album_id  INTEGER,
    len INTEGER, rating INTEGER, count INTEGER,
    genre_id INTEGER
);

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

);
''')


fname =('C:/Users/Jeremiah/Desktop/Python/code3/tracks/Library.xml')
#if ( len(fname) < 1 ) : fname = 'Library.xml'

# <key>Track ID</key><integer>369</integer>
# <key>Name</key><string>Another One Bites The Dust</string>
# <key>Artist</key><string>Queen</string>
def lookup(d, key):
    found = False
    for child in d:
        if found : return child.text
        if child.tag == 'key' and child.text == key :
            found = True
    return None

stuff = ET.parse(fname)
all = stuff.findall('dict/dict/dict')
print('Dict count:', len(all))
for entry in all:
    if ( lookup(entry, 'Track ID') is None ) : continue

    name = lookup(entry, 'Name')
    artist = lookup(entry, 'Artist')
    album = lookup(entry, 'Album')
    count = lookup(entry, 'Play Count')
    rating = lookup(entry, 'Rating')
    length = lookup(entry, 'Total Time')
    genre = lookup(entry, 'Genre')
    if name is None or artist is None or album is None :
        continue

    #print(name, artist, album, count, rating, length,genre)
    #cur.execute('SELECT id from ')

    cur.execute('''INSERT OR IGNORE INTO Artist (name)
        VALUES ( ? )''', ( artist, ) )
    cur.execute('SELECT id FROM Artist WHERE name = ? ', (artist, ))
    artist_id = cur.fetchone()[0]

    cur.execute('''INSERT OR IGNORE INTO Album (title, artist_id)
        VALUES ( ?, ? )''', ( album, artist_id ) )
    cur.execute('SELECT id FROM Album WHERE title = ? ', (album, ))
    album_id = cur.fetchone()[0]

    cur.execute('''INSERT INTO Genre (name)
        VALUES ( ? )''',(genre, ) )
    cur.execute('SELECT id FROM Genre WHERE name = ? ', (genre, ))
    genre_id = cur.fetchone()[0]

    print (name)
    print(artist)
    print(genre_id)

    if genre_id is not None:

        cur.execute('''INSERT OR IGNORE INTO Genre (genre_id)
        VALUES (?)''',(genre_id, ))

        cur.execute('''INSERT OR REPLACE INTO Track
            (title, album_id, len, rating, count)
            VALUES ( ?, ?, ?, ?, ? )''',
            ( name, album_id, length, rating, count ) )
        genre_id = None
        conn.commit()
        continue


    else:

        cur.execute('''INSERT OR REPLACE INTO Genre (genre_id)
            VALUES (?)''',(genre, ))

        cur.execute('''INSERT OR REPLACE INTO Track
            (title, album_id, len, rating, count)
            VALUES ( ?, ?, ?, ?, ? )''',
            ( name, album_id, length, rating, count ) )
        #genre_id = None
    conn.commit()
print('done')

[Команда: python -u C: \ Users \ Jeremiah \ Desktop \ Python \ code3 \ track \ track.py] Количество Dict: 404 Еще один кусает Пыльную Королеву 1 Asche Zu AscheRammstein 3 Школы Красоты Выпускные Разные 5 Черная собака под руководством Zeppelin 1 Верните мальчиков домой Pink Floyd 1 Круги Bryan Lee 11 Удобно онемевший Pink Floyd 1 Сумасшедшая маленькая вещь под названием Love Queen 1 Электрические похороны Black Sabbath 17 Толстая дама для девочек Queen 1 Для тех, кто собираетсяРок (мы приветствуем вас) AC / DC 1 Четыре палки Led Zeppelin 1 Furious Angels Rob Dougan 5 Gelle Bryan Lee 27 Поездка в Калифорнию Led Zeppelin 1 Смазка Разное 5 Hand of Doom Black Sabbath 17 Hells You AC / DC 1 Hey You Pink Floyd 1Я беспокоюсь, Брайяn Lee 27 Iron Man Black Sabbath 17 Есть там кто-нибудь?Пинк Флойд 1 Это был очень хороший год Фрэнк Синатра 45 Это твое движение Брайан Ли 27 Джек Стриптизерши / Сапоги фей Черная суббота 17 Killer Queen Queen 1 Laichzeit Rammstein 3 Подведи меня легко Брайан Ли 27 Туманная гора Хоп Led Zeppelin 1 Нет НизкаяДаун Брайан Ли 27 Теперь ты ушел из Америки 45 За пределами стены Пинк Флойд 1 Параноидальная черная суббота 17 Планета Караван Черная суббота 17 Симпатичная Джини Брайан Ли 27 Раммштайн Раммштайн 3 Крысиный салат Черная суббота 17 Рок-н-ролл Led Zeppelin 1 Поездка по пустыне Америки 45Сэнди Разное 5 Встряхни свой фундамент AC / DC 1 Сестра Золотые Волосы Америка 45 Кто-то, чтобы любить Королеву 1 Лестница на небеса Светодиод Цеппелин 1 Незнакомцы ночью Фрэнк Синатра 45 Летние ночи Разные 5 Летний ветер Фрэнк Синатра 45 Thats Life Фрэнк Синатра 45 Битва приEvermore Led Zeppelin 1 Блюз "Есть" Брайан Ли 27 Вот он, Брайан Ли 27 Думаю, Брайан Ли 27 Этот город Фрэнк Синатра 45 Железный человек Америка 45 Трек 01 Билли Цена 27 Трек 02 Билли Цена 27 Трек 03 Билли Прик27 Мессин с малышом The Canets Blues Band 27 Трек 04 Билли Прайс 27 Штормовый понедельник Canets Blues Band 27 Трек 05 Билли Прайс 27 Ожидание на льду Брайан Ли 27 War Pigs / Luke's Wall Black Sabbath 17 Мы - королева чемпионов 1 Мы будемRock You Queen 1 Когда кто-то тебя любит Frank Sinatra 45 Когда Lvee Breaks Led Zeppelin 1 Ты тот, кого я хочу разного 5 Ты сделал меня не так, Брайан Ли 27 Ты потряс меня всю ночь напролет AC / DC 1 Ты мой лучший другQueen 1 Zion Fluke 5 Кто сотворил кто AC / DC 1 DT AC / DC 1 Мойка Pink AC / DC 1 Поездка на AC / DC 1 Гоняй на туз AC / DC 1 Уолт Ихр Бетс Ин Фламмен Сехен Раммштайн 3 Der Meister Rammstein 3Weisses Fleisch Rammstein 3 Seemann Rammstein 3 Du Riechst So Gut Rammstein 3 Das Alte Leid Rammstein 3 Heirate Mich Rammstein 3 Herzeleid Rammstein 3 Баба О'Рейли Кто 1 Сделка Кто 1 Любовь Не для того, чтобы держать кого 1 Моя жена Кто Кто 1Песня закончена над тем, кто 1 получает мелодию, кто 1 становится мобильным, кто 1 за голубыми глазами, кто 1 выигралОбмануть снова Кто Кто 1 Фолсом Тюрьма Блюз Джонни Кэш 189 Я иду по линии Джонни Кэш 189 Получаю ритм Джонни Кэш 189 Большая река Джонни Кэш 189 Угадай, что случилось таким образом Джонни Кэш 189 Кольцо Огня Джонни Кэш 189 Джексон Джонни Кэш 189 AМальчик по имени Сью (в прямом эфире) Джонни Кэш 189 Ты поднимешь меня, Села 205 Держись, я иду, The Canets Blues Band 27 У меня есть Mojo Работа на Canets Blues Band 27 Sweet Home ChicagoThe Canets Блюз-бэнд 27 Тяжелая любовь The Canets Блюз-бэнд 27 Холодное холодное чувство The Canets Блюз-бэнд 27 Одинокий проспект The Canets Блюз-бэнд 27 Доброе утро Маленькая школьница The Canets Блюз-бэнд 27 Посыпай мою метлу Канеты Блюз-бэнд 27 Дай мне 'Lovin Canets'Блюз-бэнд 27 Всем нужен кто-то, чтобы любить Канеты Блюз-бэнд 27 Черная магия Женщина Кантеты Блюз-бэнд 27 Steppin 'Rooster Канеты Блюз-бэнд 27 Наша любовь дрейфует с Канетами Блюз-бэнд 27 Doin' 100 Канеты Блюз-бэнд 27 Мать Джой Мэтт Эндер235 Плач солдата Стив Макдональд 235 Дюламан Алтан 235 Стрелка Крис Сферис 235 Испанский Глаза Ла Эсперанса 235 Банановая бухта Луис Виллегас 235 Агуас Де Марко Роза Пассос 235 Тамборея Энергипси 235 Унесенные Холли Смитом 235 Иммигрант Джоани Мэдден 235 Сигер-Кайс 235 Большой Кобер 235 Сигер 235 ПегШерил Ганн 235, плавающая навсегда Дин Эверсон 235 Открытая дорога Джефф Бэйли 261 Рубин Кайзер Чифс 263 Сердитая Вожак Кайзер Шеферс 263 Жара умирает Кайser Chiefs 263 Highroyds Kaiser Chiefs 263 Любовь - не соревнование (но я выигрываю) Kaiser Chiefs 263 Большое спасибо Kaiser Chiefs 263 Я могу сделать это без вас Kaiser Chiefs 263 Мой вид Guy Kaiser Chiefs 263 В наши дни все Kais Chiefs, все в среднем263 хорошо усвоили мой урок. Kaiser Chiefs. 263 Попробуй свои лучшие Kaiser Chiefs. 263 Отставные Kaiser Chiefs. 263 The Angry Mob [Live From Berlin] Kaiser Chiefs. 263 Мне нравится сражаться с Kaiser Chiefs. 263 От шеи.: Файл «C: \ Users \ Jeremiah \ Desktop \ Python \ code3 \ track \ track.py», строка 89, в genre_id = cur.fetchone () [0] TypeError: объект 'NoneType' не может быть подписан [Завершено в 1.415s]

1 Ответ

0 голосов
/ 19 февраля 2019

Из ваших комментариев я понимаю, что cur.fetchone() возвращает None Вы получаете сообщение об ошибке, так как работаете: None[0].

Когда вы cur.fetchone() фактически выведете один элемент из курсора, а также удалите его, элемент будет вытолкнут, и в вашем случае он будет потерян!Таким образом, вместо запуска cur.fetchone() несколько раз, вы должны сохранить его в переменной вроде:

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