Как я могу обрабатывать таблицу из 22 столбцов с помощью Slick, используя вложенные кортежи или HLists?

Я новичок в Scala (использую 2.10) и Slick (использую 2.0-M2). Я вижу, что одним из способов обойти ограничение в 22 столбца для таблиц в Slick является использование вложенных кортежей. Я не могу понять, как это сделать, несмотря на то, что нашел эту часть кода на GitHub.

Текущая ветка разработки Scala (2.11-M5) поддерживает классы case с более чем 22 элементами, но не кортежи с арностью > 22. И Slick еще не распространяется для предварительных выпусков Scala 2.11. Как я могу определить таблицу из 33 столбцов (и заставить ее работать со всем синтаксическим сахаром Slick)?

NB, я пытаюсь поддерживать существующую схему и не могу изменить нормализацию таблицы.


person sventechie    schedule 28.10.2013    source источник
comment
Вам не поможет, но связанный метод " title="можно ли вывести коллекцию вместо кортежа в методе scalding map">stackoverflow.com/questions/19593137/ (поместив его туда, потому что, если кто-то ответит на этот вопрос, он может ответить на этот парень тоже)   -  person om-nom-nom    schedule 28.10.2013
comment
Этот связанный вопрос содержит много полезной информации: stackoverflow.com/questions/13906684/   -  person sventechie    schedule 31.10.2013


Ответы (2)


Здесь я пишу пост, чтобы выдать решение. Вот ссылка: https://lihaimei.wordpress.com/2016/03/30/slick-1-fix-more-than-22-columns-case/

Я рисую несколько графиков и использую разные цвета, чтобы помочь вам быстрее понять.

Подводя итог, я использую дополнительный класс case, чтобы упаковать несколько столбцов в один, что не повлияет на реальные физические столбцы. И затем, когда мы используем проекцию для сопоставления с пользовательским типом, мы задействуем кортеж обратно. Это хакерское решение, но оно легко устраняет ограничение языка программирования Scala, при котором размер кортежей должен быть меньше 22.

person Haimei    schedule 31.03.2016

Тестовый код, на который вы ссылались, устарел. Если вы не используете сопоставления для своих таблиц, все просто: тип * соответствует типу возвращаемого значения, которое вы получаете при запросе таблицы, будь то отдельный кортеж, HList или вложенные кортежи. Начиная с Slick 2.1 это работает для всех операций. (В версии 2.0 это не поддерживалось для проекции *, поэтому вам пришлось определить альтернативную проекцию и переопределить create_*.) См. здесь для примера HList.

Если вы хотите сопоставить проекцию * с пользовательским типом, вы также используете оператор <> как для одного кортежа, но вы не получаете удобства методов tupled и unapply, которые автоматически генерируются для классов case, поэтому вам нужно напишите две функции сопоставления (от несопоставленного к сопоставленному типу и обратно) вручную, как показано здесь. Обратите внимание, что Scala 2.11 не улучшает эту ситуацию. Хотя он позволяет использовать классы case с более чем 22 полями, соответствующих типов Function для аритетов > 22 нет, поэтому вы по-прежнему не можете использовать tupled и unapply.

В качестве альтернативы написанию этих функций вы можете определить поднятый тип, соответствующий вашему отображаемому типу, как объяснено в руководстве. Это особенно полезно, когда у вас есть вложенные классы case (из ‹= 22 полей каждый) для вашего отображаемого типа. Вам нужно только определить отдельные сопоставления для каждого класса случаев, и они будут автоматически составляться, когда вы используете их в проекции * (или в любом другом месте проекции или запроса).

person szeiger    schedule 30.01.2015
comment
Я не могу заставить это пользовательское сопоставление классов case (на основе теста) работать. Я открыл здесь связанный вопрос: stackoverflow.com/questions/28305023/ - person Sebastien Lorber; 03.02.2015