我很難在我的 Flask 應用程序中使用 LIKE 語句來查詢我的數據庫。我不斷收到語法錯誤。我的應用程序用于搜索書籍,我需要能夠搜索所有列。我知道我需要使用 LIKE 但似乎我的變量中的單引號妨礙了。但是,我不是 100% 肯定的。我知道如果我想從基于 id 的表中選擇全部,格式將是這樣的:id = request.form.get('id')name = db.execute("SELECT first_name FROM users WHERE id=:id", {"id": current_id})如果我用 LIKE 嘗試這種類似的格式,例如:search = request.values.get('search')books = db.execute("SELECT * FROM books WHERE author LIKE '%:search%'", {"search": search}).fetchall()我收到此錯誤:sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "Raymond"LINE 1: SELECT * FROM books WHERE author LIKE '%'Raymond'%'^[SQL: SELECT * FROM books WHERE author LIKE '%%%(search)s%%'][parameters: {'search': 'Raymond'}](Background on this error at: http://sqlalche.me/e/f405)從這個錯誤中,我可以看到單引號被添加到我的變量值(搜索),但我沒有成功去除或替換它們。所以我嘗試了這種格式:search = request.values.get('search')books = db.execute("SELECT * FROM books WHERE author LIKE %s", ('%' + search + '%',)).fetchall()但這也給了我一個錯誤: AttributeError: 'list' object has no attribute 'keys'我已經為此工作了大約四天,但我嘗試過的任何方法都沒有奏效。我很茫然。我知道我需要去掉那些單引號,但我不確定怎么做。我有一種感覺,它非常容易,這會讓我很傷心,但作為新手,我正在盡我最大的努力。如果您需要任何其他信息,請告訴我。
2 回答

萬千封印
TA貢獻1891條經驗 獲得超3個贊
對于參數化查詢,您永遠不需要在語句中使用引號,它們將由 db api 添加。這應該有效:
search = request.values.get('search')
books = db.execute("SELECT * FROM books WHERE author LIKE :search", {"search": '%' + search + '%'}).fetchall()
%符號必須是參數的一部分,以便最終:search可以用帶引號的搜索字符串替換,如此處所述。
錯誤消息顯示如果查詢已經包含引號會發生什么:將添加另一組引號,從而中斷查詢。
但請注意,這也可能會出現此處所述的問題:表達式中的反斜杠LIKE被視為轉義字符,可用于將傳遞的字符串中的通配符視為其文字值,但如果使用不當,可能會導致意外的搜索結果,或者可能導致錯誤(例如,如果 like 模式以反斜杠結尾)。
如果您不打算允許用戶在搜索字符串中插入通配符,則需要對它們進行轉義,或者考慮改用position()函數:
position(:search in author) > 0
添加回答
舉報
0/150
提交
取消