Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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