2013-10-28 3 views
19

Ich bin neu in Scala (mit 2.10) und Slick (mit 2.0-M2). Ich sehe, dass eine der Möglichkeiten, die 22-Spalten-Grenze für Tabellen in Slick zu umgehen, die Verwendung verschachtelter Tupel ist. Ich kann nicht herausfinden, wie man das macht, obwohl man this partial code on GitHub findet.Wie kann ich eine> 22 Spaltentabelle mit Slick mit verschachtelten Tupeln oder HLists behandeln?

Aktueller Dev-Zweig Scala (2.11-M5) unterstützt Fallklassen mit mehr als 22 Elementen, aber keine Tupel mit Arity> 22. Und Slick ist noch nicht für Scala 2.11-Vorabversionen verfügbar. Wie kann ich eine 33-Spalten-Tabelle definieren (und mit Slicks syntaktischem Zucker arbeiten)?

N.B. Ich versuche, ein vorhandenes Schema zu unterstützen und kann die Tabellennormalisierung nicht ändern.

+1

Wird Ihnen nicht helfen, aber in Bezug http://StackOverflow.com/Questions/19593137/ can-i-output-a-collection-statt-von-a-tuple-in-brühen-map-methode (es dort hinstellen, denn wenn jemand mit einer antwort auf diese frage kommen würde, könnte er auch diesem typ antworten). –

+0

Diese verwandte Frage hat viele nützliche Informationen: http://stackoverflow.com/questions/13906684/scala-slick-method-i-can-not-understand-so-far – sventechie

Antwort

1

Der Testcode, mit dem Sie verbunden sind, ist veraltet. Wenn Sie Zuordnungen für Ihre Tabellen nicht verwenden, ist es einfach: Der Typ * entspricht dem Rückgabetyp, den Sie erhalten, wenn Sie die Tabelle abfragen, ob es ein einzelnes Tupel, ein HList oder verschachtelte Tupel sind. Seit Slick 2.1 funktioniert das für alle Operationen. (In 2.0 wurde es für die * Projektion nicht unterstützt, also mussten Sie eine alternative Projektion definieren und create_* überschreiben.) Siehe here für ein HList-Beispiel.

Wenn Sie die * Projektion auf einen benutzerdefinierten Typ zuordnen möchten, verwenden Sie auch den <> Operator als für ein einzelnes Tupel aber bekommt man nicht die Bequemlichkeit der tupled und unapply Methoden, die automatisch generiert für Fallklassen, Sie müssen also die beiden Zuordnungsfunktionen (vom nicht zugeordneten zum zugeordneten Typ und zurück) manuell schreiben, wie in der Abbildung here gezeigt. Beachten Sie, dass Scala 2.11 diese Situation nicht verbessert. Während es Fallklassen mit mehr als 22 Feldern zulässt, gibt es keine entsprechenden Function Typen für Aritäten> 22, so dass Sie immer noch tupled und unapply nicht verwenden können.

Als Alternative zum Schreiben dieser Funktionen können Sie einen aufgehobenen Typ definieren, der Ihrem zugeordneten Typ wie explained in the manual entspricht. Dies ist besonders nützlich, wenn Sie geschachtelte Fallklassen (von < = jeweils 22 Felder) für den zugeordneten Typ haben. Sie müssen nur separate Zuordnungen für jede Fallklasse definieren und sie werden automatisch zusammengesetzt, wenn Sie sie in einer * Projektion (oder an einem anderen Ort in einer Projektion oder Abfrage) verwenden.

+0

Ich kann diese benutzerdefinierte Fallklassenzuordnung nicht vornehmen (basierend auf dem Test) zu arbeiten. Ich habe eine verwandte Frage hier geöffnet: http://stackoverflow.com/questions/28305023/custom-mapping-to-nested-case-class-structure-in-slick-more-than-22-columns –

5

Hier schreibe ich einen Beitrag, um die Lösung zu geben. Hier ist der Link: https://lihaimei.wordpress.com/2016/03/30/slick-1-fix-more-than-22-columns-case/

Ich zeichne einige Grafiken und verwenden Sie verschiedene Farben, damit Sie schnell verstehen.

Zusammenfassend verwende ich zusätzliche Fall-Klasse, um einige Spalten zu einer zu verpacken, die reale physische Spalten nicht beeinflussen wird. Und wenn wir Projektion verwenden, um einen benutzerdefinierten Typ zuzuordnen, verwenden wir Tupel zurück. Dies ist eine Hack-Lösung, aber es ist leicht zu beheben Scala Programmiersprache Limit, wo die Größe der Tupel sollte weniger als 22 sein.

Verwandte Themen