如何正确使用 SQL LIKE 语句从 Flask 应用程序中查询数据库

我很难在我的 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'


我已经为此工作了大约四天,但我尝试过的任何方法都没有奏效。我很茫然。我知道我需要去掉那些单引号,但我不确定怎么做。我有一种感觉,它非常容易,这会让我很伤心,但作为新手,我正在尽我最大的努力。


如果您需要任何其他信息,请告诉我。


饮歌长啸
浏览 127回答 2
2回答

万千封印

对于参数化查询,您永远不需要在语句中使用引号,它们将由 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

慕娘9325324

format在这个话题上对我有帮助。例子:query = "SELECT title FROM movies WHERE title LIKE '%{s}%'".format(s=Keyword)  cursor.execute(query)你可以参考这个帖子。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python