CS50:LIKE 运算符,带有 % 扩展的变量替换

DGs*_*DGs 3 python postgresql sqlalchemy cs50

我正在尝试查询一个名为 results 的变量,在该变量中我查询数据库以查找标题类似于从 post 方法接收到的搜索栏输入的书籍。我正在运行的查询如下:

results = db.execute("SELECT * FROM books WHERE title LIKE (%:search%)", {"search": search}).fetchall();
Run Code Online (Sandbox Code Playgroud)

通过上述查询,我​​收到以下错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) syntax error at or near "%".
Run Code Online (Sandbox Code Playgroud)

如果我删除 %,或者如果我手动提供LIKEa 参数(例如:),这将按预期工作LIKE ('%the%'),但这并没有真正返回任何结果,除非搜索与数据库中的书名之一完全相同,并且它失败了通过对参数进行硬编码来使用变量替换的目的。我还想知道在使用 SQLAlchemy 查询时是否可以使用 ILIKE 来区分大小写。

我知道我可以使用对象关系映射,并使用不同的函数,例如过滤器函数等等,但是对于这个分配,我们打算不使用 ORM 并使用简单的查询。有什么建议?

Ilj*_*ilä 6

将整个搜索字符串作为参数传递给 LIKE运算符

results = db.execute(text("SELECT * FROM books WHERE title LIKE :search"),
                     {"search": f"%{search}%"}).fetchall();
Run Code Online (Sandbox Code Playgroud)

或者在数据库中连接:

results = db.execute(
    text("SELECT * FROM books WHERE title LIKE ('%' || :search || '%')"),
    {"search": search}).fetchall();
Run Code Online (Sandbox Code Playgroud)