Нельзя передать имя столбца в качестве параметра для запроса. Что происходит с вашим кодом, так это то, что Postres понимает параметр :type
как буквенную строку и пытается сопоставить его с другим параметром. Это не то, что вы хотите.
Так что вам нужно будет объединить имя столбца в строку запроса. Это означает, что вам нужно выполнить правильную проверку на стороне приложения до , иначе вы подвергаете свой код SQL инъекции; Я ожидаю, что вы сможете проверить имя столбца по фиксированному списку значений.
str = request.args.get("str")
type = request.args.get("type")
# !! perform parameter validation !!
query = "%" + str + "%"
books = db.execute("SELECT * FROM books WHERE " + type + " ILIKE :query", {"query": query}).fetchmany(100)
Примечание: ILIKE
это оператор, а не функция - вам не нужно окружать правый операнд с круглыми скобками.