" TypeError:' NoneType'对象是不可取消的"使用fetchone()[0]

时间:2017-04-05 15:35:42

标签: python sqlite

我在fetchone() lib对象sqlite3上遇到connect函数问题:

  • 我的查询可能并不总是返回值;
  • 检查是否返回了值;
  • 如果它返回一个值,我会使用fetchone()[0];
  • 将该值赋给我的变量

执行代码:

conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
c.execute("SELECT average from logs WHERE process = (?)", (process,))
print c.fetchone()
print "\n"
if c.fetchone() is not None:
    lastaverage = c.fetchone()[0]
    print lastaverage
    print average
    if average > lastaverage * 1.3:
        print "The process took too long to execute."
    else:
        lastaverage = 0
        print "Script entered here!!"

这是我的输出:

Script entered here!!

(u'0',)


Script entered here!!

(u'200',)


Script entered here!!

None


Script entered here!!

(u'0',)

Traceback (most recent call last):
  File "script.py", line 87, in <module>
    lastaverage = c.fetchone()[0]
TypeError: 'NoneType' object is unsubscriptable

从我搜索的内容来看,如果我尝试lastaverage = None[0]这是有意义的,就会发生同样的错误。但是,只有在c.fetchone()返回值时才执行此行。

使用if c.fetchone()[0] is not None:会返回相同的错误,但是在if行上!这似乎是一个线索,但我不知道到底是什么。我也尝试使用if c.fetchone()[0]:而不是is not None条件,但行为是相同的。

我的python版本是2.6.6。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我相信你犯的错误是对fetchone()的第二次调用,几乎按定义只能在执行返回单行查询的游标上调用一次。尝试保存结果并使用保存的值,而不是在不执行第二个查询的情况下调用fetchone()两次。第一个调用耗尽了结果集,因此第二个调用返回None

fetchone会返回一行,因此fetchone()[0]会为您提供该行的第一行(在本例中为唯一的)。但只有当fetchone实际返回一行时才会出现!