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()中?这个函数是从哪里来的? Core execute() 默认情况下不处理名为 paramstyle(:search),而是将查询字符串按原样传递给底层 DB-API 方法——通常不支持命名样式任何一个。另一方面,text() 构造将命名样式转换为 DB-API 正在使用的样式。

以上是关于CS50:LIKE 运算符,带 % 扩展的变量替换的主要内容,如果未能解决你的问题,请参考以下文章

VertX SQL 查询与参数如何使用 LIKE ?带通配符

CS5266设计TYPEC转HDMI带PD和USB3.1数据传输USB-C扩展坞方案资料

VBA Excel:Like 运算符无法正常工作

sql select where like 变量模糊查询

PyMongo - 使用变量来 sql 'LIKE' 查询

如何在 Sheetrock 中使用 LIKE 运算符