Как динамически собирать 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/)

Мне интересно, какой могла бы быть стратегия или реализация этого, поскольку мне не удалось создать ничего, что я считаю очень подходящим для этого.

0 ответов

Другие вопросы по тегам