即使条件足够

时间:2017-04-17 21:36:39

标签: python sqlite python-3.4

usrIngredient = input("\nEnter an ingredient that you would like to make a drink with: \n\n")


query = c.execute("SELECT DRDESC FROM Drinks WHERE DRDRID IN"
                  "(SELECT DTDRID FROM Detail WHERE INGID "
                  "=(SELECT INGID FROM Ingredients WHERE INDESC LIKE ?))", (usrIngredient,))

resultset = c.fetchall()

for result in resultset:
    if resultset != None:
        result = ' '.join(result)
        print(result)
    else:
        print("Sorry, there are no drinks with that ingredient")

我正在执行一个SQL查询,该查询从我的数据库中获取具有用户输入成分的所有饮料。如果没有饮料含有用户输入的成分......它应该打印出最后一行代码。相反,它打印一个空行。

3 个答案:

答案 0 :(得分:0)

如果没有结果,resultset是一个空列表,永远不会输入for循环。你可能想试试这个:

resultset = c.fetchall()
if not resultset:
    print("Sorry, there are no drinks with that ingredient")
else:
    for drdesc, in resultset:
        print(drdesc)

答案 1 :(得分:0)

基本上,您尝试做的所有事情都会因NoneType而失败:例如,for result in NoneTypeErrorresultresultset不是None

if resultset:可能就是您所需要的,因为cur.fetchall()的空结果集为[],而不是None

答案 2 :(得分:0)

当结果集为空时,永远不会执行for循环体(因为没有任何东西可以分配给result)。所以身体中的if永远不会被执行。

要检查for循环是否完全无法运行,您必须将else子句放在for本身上:

for result in resultset:
    ...
else:
    print("Sorry, there are no drinks with that ingredient")

每次result循环迭代时,for都会被赋予一个新值,因此您无法使用它来收集整体结果;你必须使用不同的变量。 resultset中的项是行,即它们是包含列值的元组(即使只有一列);你必须使用类似x[0]的东西来从元组中提取值。并且join需要一个列表。您可以直接在光标上迭代,而不是首先将所有结果读入内存:

c.execute("...")
result = ' '.join([row[0] for row in c])
if result != '':
    print(result)
else:
    print("Sorry, there are no drinks with that ingredient")