我很难在我的 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
提交
取消