2017-04-14 3 views
0

Cette fonction est supposée vérifier l'ingrédient entré par l'utilisateur après l'invite. Lorsque j'essaie cette requête dans sqlite (sans l'entrée de l'utilisateur bien sûr) cela fonctionne. En python, il est dit qu'il y a une erreur!sqlite3 "OperationalError: near") ": erreur de syntaxe" 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

Pouvez-vous envoyer tout le message d'erreur? Est-ce que python se plaignait ou SQL? – tdelaney

Répondre

1

Vous n'avez pas inclus un espace réservé de paramètre SQL dans votre requête. Vous devrez placer un ? dans la requête pour chaque valeur que vous souhaitez interpoler:

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

Vous pouvez regarder dans la prise jointures, je doute que l'aide va imbriqués sélectionne pour effectuer tout ce bien. Je soupçonne que ce qui suit fonctionnerait mieux:

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,)) 

Si vous vouliez usrIngredient à traiter comme une recherche de sous-chaîne , vous devrez ajouter des caractères génériques pour pour LIKE fonctionner correctement. Entourez la valeur avec % caractères:

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

Cette remplace la chaîne eggs avec %eggs% pour trouver toutes les descriptions des ingrédients correspondant qui contiennent le texte eggs.

0

Peut-être quelque chose comme ceci:

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,))