.filter_by (несколько аргументов) по умолчанию будет иметь значение И, что означает, что пользователю придется вводить данные, соответствующие всем полям
Это также означает, что если пользователь оставляет поля пустыми,query будет возвращать только те книги, которые имеют (например) title = "" (когда форма заголовка пуста), несмотря на то, что введен правильный год.
Это, вероятно, не предназначено, с точки зрения пользователя. Способ исправить это состоит в том, чтобы (1. проверить входные данные, а затем) добавить фильтры в список, если они не пусты, а затем добавить непустые поля с помощью или _ (* filter_list). Затем Query вернет все строки, которые соответствуют любому полю, указанному в формах.
from sqlalchemy import or_
query = db.query(Books)
filter_list = []
if request.form['isbn']:
filter_list.append(Book.isbn.ilike(request.form['isbn']))
if request.form['author']:
filter_list.append(Book.author.ilike(request.form['author']))
# etc...
if len(filter_list) > 0:
query = query.filter(or_(*filter_list))
не тестировал код, но * filter_list позволяет передавать список методу фильтра, или_ позволяет изменить значение по умолчанию AND наИЛИ
подробнее здесь: Использование ИЛИ в SQLAlchemy