ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Работа с List-types в Esqueleto: заполнение CommitteesView

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для эффективной работы с данными спиского типа в Esqueleto используйте функцию in_ в сочетании с valList. Вот универсальный шаблон поиска значений в поле Entity:

haskell
Скопировать код
fetchByList :: [FieldValue] -> IO [Entity]
fetchByList значения = runDb $ select $
  from $ \сущность -> do
  where_ $ (сущность ^. EntityField) `in_` valList значения
  return сущность

Этот запрос возвращает записи Entity, где EntityField соответствует любому из элементов, представленных в значениях. valList трансформирует список в Haskell подходящим для обработки Esqueleto образом, а in_ осуществляет фильтрацию с использованием полученного списка, что аналогично оператору IN в SQL.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Аспекты работы со списком операций

Esqueleto предоставляет возможность строить типобезопасные SQL-запросы на Haskell. Однако при работе с сложными операциями над списками иногда приходится обратиться к чистому SQL для повышения производительности или реализации специфических SQL-конструкций.

Максимизация производительности

Если вам необходима максимальная скорость выполнения, то чистый SQL может быть оптимальным выбором:

haskell
Скопировать код
runDb $ rawSql "SELECT * FROM Entity WHERE EntityField IN ?" [PersistList значения]

Да, SQL, ты все еще безупречен, когда дело доходит до скорости!

Использование настраиваемых запросов

Иногда стандартные функциональные возможности Esqueleto оказываются несостоятельными и требуется использовать пользовательские запросы или точно подобранные SQL-выражения, которые интегрируются до кода на Haskell.

Участие в Esqueleto

Вы можете помочь развитию Esqueleto, участвуя в обсуждениях и предлагая свои идеи на GitHub-репозитории: Esqueleto на GitHub.

Осознанный выбор решения

При выборе между Esqueleto и классическим SQL исходите из частоты операций в вашем приложении. Решение не должно вычисляться случайным образом!

Правильное подбор ожиданий

Не все возможности SQL на текущий момент реализованы в Esqueleto, но большую часть из них можно интегрировать без особых проблем.

Применение списков в реальных сценариях

Работа со списками часто проявляется в задачах фильтрации, операциях соединения и агрегации данных. Давайте рассмотрим несколько эффективных практик.

Искусство фильтрации

За простым оператором in_ скрывается потребность в сложной фильтрации:

haskell
Скопировать код
fetchIntersecting :: [FieldValue] -> IO [Entity]
fetchIntersecting значения = runDb $ select $
  from $ \сущность -> do
  where_ $ not_ $ isEmpty $ arrayOverlap (сущность ^. EntityFieldArray) (valList значения)
  return сущность

Когда соединения встречаются со списками

Использование соединений JOIN необходимо при работе со списками данных, которые распределены по различным таблицам:

haskell
Скопировать код
fetchJoinList :: IO [(EntityParent, [EntityChild])]
fetchJoinList = runDb $ select $
  from $ \(родитель `LeftOuterJoin` потомок) -> do
  on $ потомок ?. EntityChildParentId ==. just (родитель ^. EntityParentId)
  groupBy (родитель ^. EntityParentId)
  return (родитель, collect (потомок ?. EntityChildField))

Агрегирование для упрощения понимания

Упростите агрегацию данных с помощью функций groupBy и countRows:

haskell
Скопировать код
fetchAggregatedList :: IO [(Value FieldValue, Value Int)]
fetchAggregatedList = runDb $ select $
  from $ \сущность -> do
  groupBy (сущность ^. EntityField)
  return (сущность ^. EntityField, countRows)

Не забывайте о GROUP BY!

Подводные камни и способы борьбы с ними

Будьте начеку перед проблемами, связанными с многочисленными запросами в N+1, когда каждый элемент списка обрабатывается отдельным запросом. Используйте группировку или сложные соединения, чтобы справиться с этими трудностями.

Визуализация

Представьте себе библиотекаря, структурирующего коллекцию книг; Esqueleto в этом контексте – это инструмент для упорядочивания списков.

Markdown
Скопировать код
Книга 1: 📖 (Глава А, Глава B)
Книга 2: 📖 (Глава C, Глава A)
Книга 3: 📖 (Глава B, Глава D)

Esqueleto позволяет быстро найти все книги с "Главой А":

SQL
Скопировать код
SELECT * FROM Books WHERE 'Глава A' = ANY(chapters);

И вот, вы нашли нужные книги! 🎉

Markdown
Скопировать код
Ищем: [🔍 Глава A]
Нашли: [📖📖] // Книги 1 и 2

Так же, как библиотекарь, который ищет определенную главу, Esqueleto четко и упорядоченно находит требуемые записи. 📚🔎

Полезные материалы