CS50:LIKE 运算符,使用 % 扩展进行变量替换

CS50: LIKE operator, variable substitution with % expansion

我正在尝试查询一个名为 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 来区分大小写。

我知道我可以使用 Object 关系映射,并使用不同的功能,例如过滤功能和诸如此类的东西,但是对于这个作业,我们不应该使用 ORM 而是使用简单的查询。有什么建议么?

将整个搜索字符串作为参数传递给 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();