尝试获取LIKE查询时,Sqlite3列表索引超出范围

时间:2013-05-14 10:54:49

标签: python database sqlite raspberry-pi

我正在尝试执行以下代码:

conn = sqlite3.connect("./Databases/Functions/He.db")
cursor = conn.cursor()

sql = "SELECT * FROM Requests WHERE Request like ?"
cursor.execute(sql, [(msg)])
results = cursor.fetchall()[0]
print results

if((results)[1] == "True"):
    GPIO = (results)[2]
    Direction = (results)[3]
    print "GPIO Setup ready.."

我收到以下错误:

File "./Functions/doFunctions.py", line 29, in enRequests
results = cursor.fetchall()[0]
IndexError: list index out of range

我总是弄乱数据库,最后解决这些问题, 我不知道他们为什么从一开始就弹出来。

获取msg字符串的代码,搜索它是否存在于数据库中,如果确实存在,则接收GPIO引脚并发送信号(请求位于数据库行的索引0,而GPIO引脚位于索引{ {1}})。

1 个答案:

答案 0 :(得分:1)

您的查询返回0结果,因此没有第一行要提取。在这种情况下,.fetchall()返回一个空列表,索引0没有项目。

如果您只对查询的第一个结果感兴趣,那么您应该使用.fetchone()代替:

results = cursor.fetchone()

.fetchone()要么返回行,要么None如果没有匹配的结果。

您在查询中使用冗余括号;这不是您的问题的原因,但您可以安全地删除它们:

cursor.execute(sql, [msg])

或使用元组:

cursor.execute(sql, (msg,))

您可以在多个地方执行此操作,除了提高可读性之外,您可以在代码中删除大量(...)而不会产生任何影响。添加测试是否 来自.fetchone()调用,您的代码可能是:

if results and results[1] == "True":
    GPIO = results[2]
    Direction = results[3]
    print "GPIO Setup ready.."