python - 根据表单数据的可用性调整 SELECT 语句
问题描述
我有一个books
包含以下列的表格bid, isbn, title, author, year
在搜索页面中,为用户提供了 3 个可选输入:title
、author
和isbn
,并且应用程序在数据库中搜索具有类似标题title
或类似作者author
或 isbn 等于的书籍isbn
。并且三个输入中的任何一个都可以为空。
这是我正在使用的 SQL 查询:
if form.validate_on_submit():
title = form.title.data or 'NONE'
author = form.author.data or 'NONE'
isbn = form.isbn.data or ''
books = db.execute('SELECT * FROM books WHERE title LIKE (:title) OR author LIKE (:author) or isbn=(:isbn)',
{
'title': f'%{title}%',
'author':f'%{author}%',
'isbn': isbn
}).fetchall()
这些or 'NONE'
部分是避免使用 SQL 查询的一种解决方法,LIKE '%%'
因为它将获取所有表行,而且我知道NONE
我的 books 表中没有条目。
但是,这是一个肮脏的解决方法,我不喜欢它(也更慢?)。那么,在 LIKE 运算符中执行具有空变量的查询的干净方法是什么。
注意:我故意避免使用 ORM。
解决方案
'%%'
您可以在模式匹配中明确避免,例如
SELECT *
FROM books
WHERE
(:title <> '%%' AND title LIKE :title)
OR (:author <> '%%' AND author LIKE :author)
OR isbn = :isbn
推荐阅读
- protocol-buffers - golang 中的 protoc 文档非常混乱
- javascript - 使用 jQuery 在延迟上关闭 Bootstrap 模态
- android - 在android中捕获屏幕大小的正确方法是什么
- java - Cucumber Maven:生成测试报告后执行一个逻辑
- java - SkyLine 的启动类和主要方法
- sass - 在另一个 scss 部分中导入 scss 部分
- javascript - 在 react.js 中填充必要的数据
- go - 如何将 os.Stdout 输出复制到字符串变量
- javascript - 当我尝试使用更改时无法从提交函数调用
- vue.js - Vue2多v-for场景