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查询,该查询从我的数据库中获取具有用户输入成分的所有饮料。如果没有饮料含有用户输入的成分......它应该打印出最后一行代码。相反,它打印一个空行。
答案 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 None
为TypeError
。 result
和resultset
不是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")