我在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。任何帮助将不胜感激。

最佳答案

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

fetchone返回单行,因此fetchone()[0]为您提供该行的第一列(在此例中为唯一列)。但仅当fetchone实际上返回一行时才行!

10-08 17:12