python sqlite即使返回None也不会返回None?

时间:2019-02-19 20:37:14

标签: python sql database sqlite

这是我必须完成的在线课程作业。我们正在学习有关数据建模和关系数据库的知识。对于此分配,我们必须从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()的{​​{1}}的值,但是当我打印出None的每个值时,它仍然打印出cur.fetchone()有时。

如何清除Nonecur.fetchone()的情况?

我被困了好几天。

预先感谢您的帮助!

编辑:

None

[命令:python -u C:\ Users \ Jeremiah \ Desktop \ Python \ code3 \ tracks \ tracks.py] 字典数:404 另一个咬灰尘 女王 1个 阿什祖祖阿什 拉姆施泰因 3 美容学校退学 各种 5 黑狗 齐柏林飞艇 1个 带男孩回家 平克·弗洛伊德(乐队名 1个 界 布莱恩·李(Bryan Lee) 11 舒适地麻木 平克·弗洛伊德(乐队名 1个 疯狂的小事叫爱 女王 1个 电动葬礼 黑安息日 17 胖底的女孩 女王 1个 对于那些要摇滚的人(我们向您致敬) 交流/直流 1个 四支 齐柏林飞艇 1个 愤怒的天使 罗布·道甘 5 盖尔 布莱恩·李(Bryan Lee) 27 去加利福尼亚 齐柏林飞艇 1个 润滑脂 各种 5 厄运之手 黑安息日 17 地狱钟声 交流/直流 1个 嘿,你 平克·弗洛伊德(乐队名 1个 我担心 布莱恩·李(Bryan Lee) 27 钢铁侠 黑安息日 17 有没有人在那里? 平克·弗洛伊德(乐队名 1个 那是非常好的一年 弗兰克·西纳特拉 45 它是你的举动 布莱恩·李(Bryan Lee) 27 Jack脱衣舞娘/仙女穿靴子 黑安息日 17 杀手皇后 女王 1个 赖希特 拉姆施泰因 3 让我轻松下来 布莱恩·李(Bryan Lee) 27 迷雾山脉跳 齐柏林飞艇 1个 没有低落 布莱恩·李(Bryan Lee) 27 现在你走了 美国 45 墙外 平克·弗洛伊德(乐队名 1个 偏执狂 黑安息日 17 星球大篷车 黑安息日 17 漂亮的珍妮 布莱恩·李(Bryan Lee) 27 拉姆施泰因 拉姆施泰因 3 老鼠沙拉 黑安息日 17 摇滚乐 齐柏林飞艇 1个 穿越沙漠骑 美国 45 沙 各种 5 摇动你的基础 交流/直流 1个 金色头发姐妹 美国 45 所爱之人 女王 1个 通往天堂的阶梯 齐柏林飞艇 1个 在夜晚的陌生人 弗兰克·西纳特拉 45 夏天的夜晚 各种 5 夏日风 弗兰克·西纳特拉 45 那就是生活 弗兰克·西纳特拉 45 永恒之战 齐柏林飞艇 1个 蓝调是 布莱恩·李(Bryan Lee) 27 那里 布莱恩·李(Bryan Lee) 27 认为 布莱恩·李(Bryan Lee) 27 这个镇 弗兰克·西纳特拉 45 锡人 美国 45 音轨01 比利·普莱斯 27 第02章 比利·普莱斯 27 3号 比利·普莱斯 27 梅辛与孩子 Canettes布鲁斯乐队 27 第04章 比利·普莱斯 27 风雨如磐的星期一 Canettes布鲁斯乐队 27 第05章 比利·普莱斯 27 在冰上等待 布莱恩·李(Bryan Lee) 27 战猪/卢克之墙 黑安息日 17 我们是冠军 女王 1个 我们要让你摇滚 女王 1个 当有人爱你 弗兰克·西纳特拉 45 当堤坝破裂时 齐柏林飞艇 1个 你是我想要的那个 各种 5 你做错了我 布莱恩·李(Bryan Lee) 27 你整夜都在震动我 交流/直流 1个 你是我最好的朋友 女王 1个 锡安 福禄克 5 谁造了谁 交流/直流 1个 D.T. 交流/直流 1个 沉粉 交流/直流 1个 乘坐 交流/直流 1个 追逐王牌 交流/直流 1个 Wollt Ihr Das Bett在Flammen Sehen 拉姆施泰因 3 迈斯特 拉姆施泰因 3 维斯·弗莱施 拉姆施泰因 3 西曼 拉姆施泰因 3 杜里希斯特·索古特 拉姆施泰因 3 达斯·阿尔特·莱德 拉姆施泰因 3 希拉特·米奇 拉姆施泰因 3 赫塞莱德 拉姆施泰因 3 巴巴·奥莱利 谁 1个 讨价还价 谁 1个 爱不是保持 谁 1个 我的太太 谁 1个 歌曲结束了 谁 1个 调音 谁 1个 走向移动 谁 1个 蓝眼睛的背后 谁 1个 不会再傻了 谁 1个 佛森监狱蓝调 约翰尼·卡什(Johnny Cash) 189 我走线 约翰尼·卡什(Johnny Cash) 189 取得节奏 约翰尼·卡什(Johnny Cash) 189 大河 约翰尼·卡什(Johnny Cash) 189 猜猜事情发生那样 约翰尼·卡什(Johnny Cash) 189 火环 约翰尼·卡什(Johnny Cash) 189 杰克逊 约翰尼·卡什(Johnny Cash) 189 一个叫苏的男孩(直播) 约翰尼·卡什(Johnny Cash) 189 你鼓舞了我 塞拉 205 等等,我来了 Canettes布鲁斯乐队 27 我的Mojo工作了 Canettes布鲁斯乐队 27 芝加哥甜蜜之家 Canettes布鲁斯乐队 27 沉重的爱 Canettes布鲁斯乐队 27 冷冷的感觉 Canettes布鲁斯乐队 27 寂寞大道 Canettes布鲁斯乐队 27 早安小女生 Canettes布鲁斯乐队 27 尘土扫帚 Canettes布鲁斯乐队 27 给我一些爱 Canettes布鲁斯乐队 27 每个人都需要有人爱 Canettes布鲁斯乐队 27 黑魔法女人 Canettes布鲁斯乐队 27 踩公鸡 Canettes布鲁斯乐队 27 我们的爱在漂移 Canettes布鲁斯乐队 27 多恩100 Canettes布鲁斯乐队 27 欢乐母亲 马特·恩德(Matt Ender) 235 士兵的哀叹 史蒂夫·麦克唐纳 235 杜拉曼 阿尔坦 235 箭头 克里斯·斯菲里斯 235 西班牙人的眼睛 La Esperanza 235 香蕉湾 路易斯·维勒加斯 235 阿瓜斯·德·马可(Aguas De Marco) 罗莎·帕索斯(Rosa Passos) 235 坦波里亚 体格检查 235 走了 霍莉·史密斯 235 移民 琼妮·麦登(Joanie Madden) 235 帕兰普大水 库斯科 235 搜寻者的任务 谢丽尔·冈恩(Cheryl Gunn) 235 永远浮动 迪恩·埃弗森 235 开路 杰夫·贝利 261 红宝石 凯撒酋长 263 愤怒的暴民 凯撒酋长 263 热死了 凯撒酋长 263 Highroyds 凯撒酋长 263 爱不是比赛(但我赢了) 凯撒酋长 263 非常感谢你 凯撒酋长 263 没有你我可以做到 凯撒酋长 263 我的家伙 凯撒酋长 263 如今一切都很正常 凯撒酋长 263 很好地学习了我的教训 凯撒酋长 263 尽你所能 凯撒酋长 263 退休 凯撒酋长 263 愤怒的暴民[从柏林直播] 凯撒酋长 263 我喜欢打架 凯撒酋长 263 从脖子上下来 凯撒酋长 263 追溯(最近一次通话):   文件“ C:\ Users \ Jeremiah \ Desktop \ Python \ code3 \ tracks \ tracks.py”,第89行,在     genre_id = cur.fetchone()[0] TypeError:“ NoneType”对象不可下标 [在1.415秒内完成]

1 个答案:

答案 0 :(得分:0)

根据您的评论,我了解到cur.fetchone()返回None 由于正在运行,因此出现错误:None[0]

当您cur.fetchone()实际会从光标输出一项并将其删除时,该项目会弹出,并且在您的情况下会丢失! 因此,不要多次运行cur.fetchone(),而应将其保存在变量中,例如:

res = cur.fetchone()