CS50:LIKE 运算符,带 % 扩展的变量替换
Posted
技术标签:
【中文标题】CS50:LIKE 运算符,带 % 扩展的变量替换【英文标题】:CS50: LIKE operator, variable substitution with % expansion 【发布时间】:2018-12-30 00:39:19 【问题描述】:我正在尝试对名为 results 的变量进行查询,在该变量中我查询数据库以查找标题类似于从 post 方法接收的搜索栏中的输入的书籍。我正在运行的查询如下:
results = db.execute("SELECT * FROM books WHERE title LIKE (%:search%)", "search": search).fetchall();
通过上述查询,我得到以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) syntax error at or near "%".
如果我删除 %,或者如果我手动给 LIKE
一个参数(例如:LIKE ('%the%')
),这将按预期工作,但这并不会真正返回任何结果,除非搜索完全是数据库中的书名,并且通过硬编码参数来破坏使用变量替换的目的。我还想知道在使用 SQLAlchemy 查询时是否可以使用 ILIKE 来区分大小写。
我知道我可以使用对象关系映射,并使用不同的函数,例如过滤函数和诸如此类的东西,但是对于这个任务,我们打算不使用 ORM 并使用简单的查询。有什么建议?
【问题讨论】:
【参考方案1】:将整个搜索字符串作为参数传递给 LIKE 运算符:
results = db.execute(text("SELECT * FROM books WHERE title LIKE :search"),
"search": f"%search%").fetchall();
或者在数据库中连接:
results = db.execute(
text("SELECT * FROM books WHERE title LIKE ('%' || :search || '%')"),
"search": search).fetchall();
【讨论】:
为什么要将查询字符串封装在text()中?这个函数是从哪里来的? Coreexecute()
默认情况下不处理名为 paramstyle(:search
),而是将查询字符串按原样传递给底层 DB-API 方法——通常不支持命名样式任何一个。另一方面,text()
构造将命名样式转换为 DB-API 正在使用的样式。以上是关于CS50:LIKE 运算符,带 % 扩展的变量替换的主要内容,如果未能解决你的问题,请参考以下文章
VertX SQL 查询与参数如何使用 LIKE ?带通配符