2016-10-10 2 views
1

Ну в основном это сводится к тому, возможно ли иметь запрос, который возвращает более 16 столбцов в esqueleto?Esqueleto: Как выполнить запрос с более чем 16 столбцами?

У меня есть db das, с которым мне нужно взаимодействовать, и для этого требуется соединить таблицы с 30-40 столбцами, а затем собрать 20 возможных столбцов 80-100, которые мне нужны, поэтому я не вытягиваю столбцы больших если это необходимо. Казалось бы, с esqueleto я ограничен 16 столбцами? Есть ли способ преодолеть это без сиротских случаев?

Заранее благодарен!

PS Если требуется надуманный пример, я предоставил его.

UPDATE

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

FYI

, если вы посмотрите на документацию для SqlSelect, если вы посмотрите на экземпляры затем посмотреть весь путь направо вы увидите «намек», что это помогло мне знать, что я мог бы сделать кортежи кортежей.

+0

Вы всегда можете использовать функцию 'rawSql' из библиотеки' persistent'. Другой способ - просто создать PR для Esqueleto, который возвращает около 20 кортежей. Но я думаю, что это не тот ответ, который вы ищете. :) – Sibi

+0

rawSql, казалось, имел ограничение в 8 столбцов, если я не ошибаюсь (я давно искал этот вопрос) – sbditto85

+0

yup only 8 https://hackage.haskell.org/package/persistent-2.2.4 /docs/Database-Persist-Sql.html#t:RawSql – sbditto85

ответ

2

Вы можете создать пользовательский тип данных для представления результата этого запроса, в котором будет столько полей, сколько хотите. Затем вам необходимо реализовать соответствующие типы классов для этих данных (PersistEntity, по-видимому, является основным). Это дает вам возможность предоставлять релевантные/значимые имена для полей, чтобы помочь предотвратить возможные ошибки.

data MyResult 
    = MyResult 
    { fieldOne :: SomeType 
    , fieldTwo :: OtherType 
    , ... 
    , fieldSixteen :: Text 
    } 

и вместо возвращения (a, b, c, ..., e), вы бы вернуть MyResult a b c ... e.

Для удобства вы, скорее всего, захотите определить результат, используя квазикватер определения сущности Persistent's Entity. Вы захотите использовать это определение таким образом, чтобы он не пытался создавать миграции для этого.

+0

«Для удобства вы, скорее всего, захотите определить результат с помощью квазикватора определения сущности Persistent's. Вы захотите использовать это определение так, t попытаться создать миграцию для этого ». Я не уверен, что это значит. Я довольно новичок в haskell/yesod/persistent ... заключается в том, что 'share [mkPersist sqlSettings, mkMigrate" migrateAll "] $ (persistFileWith lowerCaseSettings" config/models ")' часть Yesod? в Model.hs? – sbditto85

+0

Да, но вы не хотите «mkMigrate», поскольку это не определение таблицы, а определение типа возвращаемого запроса. Таким образом, у вас будет 'share [mkPersist sqlSettings] [persistLowerCase | {- ваше определение модели -} |] 'в дополнение к этому. – ephrion

+0

Прохладный, я попробую его и, скорее всего, пометьте ваш ответ как правильный. Надеюсь, я заставлю его работать. – sbditto85