Raw sql со многими столбцами - PullRequest
0 голосов
/ 29 мая 2018

Я создаю приложение CRUD, которое извлекает данные с помощью Persistent и выполняет ряд довольно сложных запросов, например, с использованием оконных функций.Так как они не поддерживаются ни Persistent, ни Esqueleto, мне нужно использовать raw sql.

Хороший пример - я хочу выбрать строки, в которых значение не сильно отклоняется от предыдущего значения, поэтому впсевдо-sql условие WHERE val - lag(val) <= x.Мне нужно выполнить этот выбор в SQL, а не извлекать все данные и затем фильтровать в Haskell, потому что в противном случае у меня был бы способ обработки большого количества данных.

Эти запросы возвращают много столбцов.Тем не менее, экземпляр RawSql достигает максимума в кортежах с 8 элементами.Так что теперь я пишу дополнительные функции from9, to9, from10, to10 и так далее.И после этого все они конвертируются с использованием функций типа (Single a, Single b, ...) -> DesiredType.Хотя это может быть сокращено с помощью генерации кода, этот подход просто хакерский и явно не выглядит как хороший Haskell.Это касается меня, потому что я думаю, что для большинства моих запросов потребуется rawSql.

У вас есть предложения, как это улучшить?В настоящее время моя основная мысль состоит в том, чтобы отменить нормализацию базы данных и дублировать данные, например, включив в качестве столбца значение с задержкой, чтобы я мог запрашивать данные с помощью Esqueleto.

...