Ich habe eine Slick 3.0-Tabellendefinition, die der folgenden ähnelt:
%Vor%Ich würde gerne 2 Dinge tun können:
Seq[String]
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?
<>
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])
. 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:
*
zu erhalten
%Code%
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
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.