2017-04-14 815 views
0

这个函数应该检查用户在提示后输入的成分。当我在sqlite中尝试这个查询语句时(当然没有用户输入)它可以工作。在Python中它说有一个错误!sqlite3“OperationalError:near”)“:syntax error”python

def checkIngredient(): 

    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 is not None: 
      print(result) 
     else: 
      print("Sorry, there are no drinks with that ingredient") 
+0

你能后整个错误消息?那是蟒蛇抱怨或SQL? – tdelaney

回答

1

您还没有包含在您的查询SQL参数占位符。你必须放置一个?查询您要插值每个值:

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

你可能想看看制作联接,我怀疑使用嵌套的选择是要执行那么好。我怀疑,下面会更好地工作:

query = c.execute(""" 
    SELECT dr.DRDESC 
    FROM Drinks as dr 
    INNER JOIN Detail as dtd on dr.DRDRID == dtd.DTDRID 
    INNER JOIN Ingredients as ing on dtd.INGID = ing.INGID 
    WHERE ing.INDESC LIKE ? 
    """, (usrIngredient,)) 

如果你想usrIngredient作为一个字符串搜索来处理,你必须通配符添加到它的LIKE正常工作。与%字符环绕值:

usrIngredient = '%{}%'.format(usrIngredient) 

这将替换字符串eggs%eggs%发现包含文本eggs所有匹配的成分说明。

0

也许是这样的:

query=c.execute("""SELECT Drinks.DRDESC 
        FROM Drinks JOIN Detail JOIN Ingredients 
        ON Drinks.DRDRID = Detail.DTDRID 
        AND Detail.INGID = Ingredients.INGID 
        where Ingredients.INDESC like ?""",(usrIngredient,)) 
相关问题