Auflisten von Spalten in einer Slick-Tabelle

9

Ich habe eine Slick 3.0-Tabellendefinition, die der folgenden ähnelt:

%Vor%

Ich würde gerne 2 Dinge tun können:

  1. Erhalte eine Liste der Spaltennamen als Seq[String]
  2. Erstellen Sie für eine Instanz von Simple eine Seq[String] , die der Art und Weise entspricht, in der die Daten mithilfe einer unbearbeiteten Abfrage in die Datenbank eingefügt werden (z. B. Simple("hello", 1, None) wird Seq("'hello'", "1", "NULL") )

Was wäre der beste Weg, dies mit der Slick-Tabellendefinition zu tun?

    
Dan Gallagher 19.09.2015, 21:38
quelle

2 Antworten

7
  • Erstens ist es nicht möglich, Slick auszutricksen und die Reihenfolge auf der linken Seite des <> Operators in der Methode * zu ändern, ohne die Reihenfolge der Werte in Simple , den Zeilentyp von% co_de zu ändern %, dh was Ben angenommen hat, ist nicht möglich. Der Simples Rückgabetyp der ProvenShape Projektionsmethode stellt sicher, dass ein * für die Übersetzung zwischen dem Shape -basierten Typ in * und dem clientseitigen Typ verfügbar ist und wenn Sie Column mit Simple definiert schreiben as def * = (c, b, a) <> Simple.tupled, Simple.unapply) , Slick wird sich beschweren mit einem Fehler "Keine passende Form gefunden. Slick weiß nicht wie man die gegebenen Typen abbildet ...". Ergo, Sie können über alle Elemente einer Instanz von Simple mit seiner case class Simple(a: String, b: Int, c: Option[String]) .
  • iterieren
  • Zweitens haben Sie bereits die Definition der productIterator -Tabelle in Ihrem Code und Abfragen von Metatabellen, um dieselben Informationen zu erhalten, die Sie bereits haben, ist nicht sinnvoll. Sie können alle Ihre Spaltennamen mit einem Einzeiler Simples erhalten. Beachten Sie, dass die simples.baseTableRow.create_*.map(_.name) -Projektion der Tabelle auch die Spalten definiert, die beim Erstellen des Tabellenschemas generiert werden. Daher werden die Spalten, die in der Projektion nicht erwähnt werden, nicht erstellt und die obige Anweisung liefert garantiert genau das, was Sie brauchen, und nichts zu löschen.

Um es kurz zu wiederholen:

  1. Um eine Liste der Spaltennamen der Simples-Tabelle als * zu erhalten %Code%
  2. Um eine Seq[String] zu generieren, die der Darstellung der Daten entsprechen würde würde mit einer rohen Abfrage für simples.baseTableRow.create_*.map(_.name).toSeq in die Datenbank eingefügt werden. eine Instanz von Seq[String] verwenden aSimple
Maxim Plevako 28.09.2015, 12:19
quelle
1

Um die Spaltennamen zu erhalten, versuchen Sie Folgendes:

%Vor%

Dies wird gedruckt

%Vor%

Und für die Fallklassenwerte können Sie productIterator verwenden:

%Vor%

ist

%Vor%

Sie müssen weiterhin die Wertezuordnung vornehmen und sicherstellen, dass die Reihenfolge der Spalten in der Tabelle und die Werte in der Fallklasse übereinstimmen.

    
poroszd 24.09.2015 17:23
quelle

Tags und Links