SQLAlchemy的LIKE运算符,具有%扩展的变量替换

时间:2018-07-22 09:51:47

标签: python postgresql sqlalchemy

我对Python还是很陌生,目前我想学习Flask框架,然后再使用Django等更大的框架,但是现在我对SQLAlchemy有疑问。

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

results = db.execute("SELECT * FROM books WHERE title .like(%:search%)", {"search" : search}).fetchall();

通过上面的查询,我得到以下错误:sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError)语法错误在“%”或附近。

如果我删除%,或者手动给.like函数一个参数(例如:.like(“%the%”)),此方法将按预期工作,但是除非搜索为完全与数据库中的任何书名相同,并且它通过对参数进行硬编码而无法实现使用变量替换的目的。我还想知道是否可以将ILIKE用于SQLAlchemy的不区分大小写的查询。

我知道我可以使用对象关系映射,并使用不同的功能,例如过滤器功能和其他功能,但是对于此分配,我们本意是不使用ORM而是使用简单的查询。有什么建议么?

预先感谢

1 个答案:

答案 0 :(得分:0)

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

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();