Как динамически собирать SQL-запросы с помощью haskell на основе параметров маршрута
У меня есть веб-приложение Scotty, в котором я пытаюсь реализовать интерфейс динамического поиска, и постоянно упираюсь в то, как мне его реализовать. Основная посылка следующая:
Учитывая список параметров URL: let params = [Param]
где параметр: type Param = (Text, Text)
Я хотел бы иметь возможность
Допустим, у меня есть таблица в моей базе данных, где:
Users
| user_id | username | email | first_name | last_name | created_at |
|---------|----------|-------|------------|-----------|------------|
| Int | Text | Text | Text | Text | timestamp |
Мой базовый SQL-запрос может выглядеть так:
baseQuery :: Query
baseQuery :: [sql| SELECT user_id, username, email, first_name, last_name, created_at FROM users |]
В случае получения параметров URL-адреса я хотел бы применить их к предложению WHERE, ORDER BY и т. Д.
Какова была бы лучшая стратегия преобразования следующего URL:
arbitraryhost:/users?order_by_max=user_id&first_name=emg184&last_name=stackru&limit=20
что приведет к следующему списку параметров:
let params = [("order_by_max","user_id"), ("first_name","emg184"), ("last_name","stackru"), ("limit", "20")]
Как мне сгенерировать следующий запрос:
"SELECT user_id, username, email, first_name, last_name, created_at
FROM users
WHERE first_name = ? AND last_name = ?
ORDER BY user_id
LIMIT ?"
("emg184", "stackru", 20)
(Мне очень нравится, как работает построитель запросов knexjs, который позволяет создавать специальные фрагменты запросов и применять их как функцию более высокого порядка к некоторым базовым запросам http://knexjs.org/)
Мне интересно, какой могла бы быть стратегия или реализация этого, поскольку мне не удалось создать ничего, что я считаю очень подходящим для этого.