2017-04-17 77 views
0
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查询,该查询从包含用户输入的成分的数据库中提取所有饮料。如果没有饮料含有用户输入的成分......则应打印出最后一行代码。相反,它打印一个空行。即使条件满足,其他语句也不起作用

+2

基本上你正在试图做的将失败,'NoneType'一切:'对于结果None'是'TypeError' , 例如。 'result'和'resultset'不是'None'。 '如果resultset:'可能是你需要的,因为一个空的结果集是'[]',而不是'None'。 – TemporalWolf

回答

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) 
+0

谢谢丹尼尔它工作! –

0

基本上你正在试图做的将失败,NoneType一切:for result in NoneTypeError,例如。 resultresultset不是None

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

0

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

要检查for循环是否没有运行在所有的,你必须穿上for本身else条款:

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") 
相关问题