2017-04-14 7 views
0

この関数は、プロンプトに従ってユーザーが入力した成分をチェックすることになっています。私はsqlite(もちろん、ユーザーの入力なし)でこのクエリ文を試しても動作します。 Pythonでは、エラーがあると言います!sqlite3 "OperationalError:near") ":構文エラー" 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

は、あなたが全体のエラーメッセージを投稿することができますか?それはPythonの不平や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,)) 
関連する問題