PostgreSQL запрос к базе данных с параметризованным вводом столбцов - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь сделать запрос к базе данных с python и postgreSQL, который принимает пользовательский ввод из выпадающего списка и текстового поля. Предполагается, что входные данные из раскрывающегося списка определяют столбец для запроса ввода текста. Он работает по мере необходимости без использования входа в раскрывающемся меню, но не возвращает ничего при его использовании.

str = request.args.get("str")
type = request.args.get("type")
query = "%" + str + "%"
books = db.execute("SELECT * FROM books WHERE :type ILIKE (:query)", {"type": type, "query": query}).fetchmany(100)

1 Ответ

0 голосов
/ 03 мая 2020

Нельзя передать имя столбца в качестве параметра для запроса. Что происходит с вашим кодом, так это то, что 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 это оператор, а не функция - вам не нужно окружать правый операнд с круглыми скобками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...