scala slick Methode, die ich nicht verstehen kann, so weit
Ich versuche zu verstehen, einige Slick funktioniert und was es erfordert.
Hier ein Beispiel:
package models
case class Bar(id: Option[Int] = None, name: String)
object Bars extends Table[Bar]("bar") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
//This is the primary key column
def name = column[String]("name")
//Every table needs a * projection with the same type as the table's type parameter
def * = id.? ~ name <>(Bar, Bar.unapply _)
}
Könnte jemand mir erklären, was der Zweck der *
Methode hier, was ist <>
warum unapply
? und was ist Projektion - Methode ~
' gibt die Instanz von Projection2
?
InformationsquelleAutor der Frage ses | 2012-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
[UPDATE] - Hinzugefügt (noch einer) Erklärung auf
for
VerstehensDen
*
Methode:Dieser gibt die Standard-Projektion - das ist, wie Sie beschreiben:
Ihre Tabelle könnte einige Felder; Sie müssen nur eine Teilmenge für
Ihre Standard-Projektion. Die Standard-Projektion muss mit dem Typ
Parameter der Tabelle.
Nehmen wir es ein zu einer Zeit. Ohne die
<>
Sachen, nur die*
:Nur eine Tabelle definition wie, dass machen Sie mit Anfragen wie:
die Standard-Projektion
(Int, String)
führt zu einerList[(Int, String)]
für einfache Abfragen wie diese.
Was ist der Typ von
q
? Es ist einQuery
mit der Projektion(String, Int)
.Wenn Sie aufgerufen wird, gibt es eine
List
von(String, Int)
Tupel als pro die Projektion.In diesem Fall müssen Sie festgelegt haben, die Projektion, die Sie wollen in der
yield
- Klauselder
for
Verständnis.Nun über
<>
undBar.unapply
.Diese bietet sogenannte Zugeordnet Projektionen.
Bisher haben wir gesehen, wie slick, können Sie express-Abfragen in Scala
diese Rückkehr ein Projektion der Spalten (oder berechnete Werte); So bei der Ausführung
diese Abfragen Sie haben zu denken, das Ergebnis Zeile einer Abfrage als Scala-Tupel.
Der Typ der Tupel entsprechen der Projektion definiert ist (durch Ihre
for
Verständnis wie im vorherigen Beispiel, der durch die Standard -*
Projektion).Dies ist der Grund, warum
field1 ~ field2
gibt eine Projektion derProjection2[A, B]
woA
ist die Art derfield1
undB
ist die Art derfield2
.Beschäftigen wir uns mit Tupel, das kann umständlich sein, wenn wir zu viele haben
Spalten. Wir hoffen, dass die Ergebnisse nicht als
TupleN
sondern einigeObjekt mit benannten Feldern.
Wie funktioniert das?
<>
nimmt eine ProjektionProjection2[Int, String]
undgibt eine Gemappte Projektion auf die Art
Bar
. Die beiden ArgumenteBar, Bar.unapply _
sagen, slick, wie diese
(Int, String)
Projektion zugeordnet werden müssen, um einen Fall Klasse.Dies ist ein zwei-Wege-mapping;
Bar
ist der Fall Konstruktor der Klasse, so dass dieInformationen, die benötigt werden, um zu gehen von
(id: Int, name: String)
zu einemBar
. Undunapply
wenn Sie haben es erraten, ist für die Rückseite.
Wo kommt
unapply
kommen? Dies ist ein standard-Scala-Methode verfügbar fürjeder gewöhnliche Fall Klasse - nur die Definition
Bar
gibt Ihnen eineBar.unapply
dieist ein extractor, die verwendet werden können, um wieder die
id
undname
dass dieBar
gebaut wurde mit:Also Ihre Standard-Projektion zugeordnet werden können und die Falle Klasse, die Sie am meisten erwarten:
Oder du kannst sogar pro-Abfrage:
Hier ist die Art der
q1
ist einQuery
mit einem zugeordnet Projektion zuBaz
.Wenn Sie aufgerufen wird, gibt es eine
List
vonBaz
Objekte:Schließlich, wie nebenbei, die
.?
bietet Option Heben - die Scala ArtUmgang mit Werten, das kann nicht sein.
Denen, Nachbereitung, wird gut funktionieren mit Ihrem original-definition von
Bar
:Antwort auf den Kommentar wie Slick verwendet
for
Verstehens:Irgendwie Monaden immer wieder schaffen, sich zu zeigen und Nachfrage
Teil der Erklärung sein...
Für Verstehens sind nicht auf bestimmte Kollektionen nur.
Sie können verwendet werden, auf jede Art von Monade und Sammlungen sind
nur eine der vielen Arten von Monaden-Typen in Scala.
Aber als Sammlungen vertraut sind, Sie machen einen guten Anfang
Punkt für eine Erklärung:
In Scala, eine für das Verständnis ist syntaktischer Zucker für
Methode (evtl. geschachtelte) Methodenaufrufe: Der obige code
ist (mehr oder weniger) gleichwertig zu:
Im Grunde nichts mit
filter
map
flatMap
Methoden (in anderen Worten, eine Monade) eingesetzt werden können
for
Verständnis stattns
. Ein gutes Beispielist die Option-Monade. Hier ist das Vorherige Beispiel
wo die gleichen
for
- Anweisung funktioniert sowohl auf derList
sowieOption
Monaden:Im letzten Beispiel, die transformation würde sich vielleicht freuen
wie diese:
In Slick, Abfragen monadischen - Sie sind nur Objekte mit
die
map
,flatMap
undfilter
Methoden. Also diefor
Verständnis(siehe die Erklärung der
*
Methode) einfach übersetzt:Wie Sie sehen können,
flatMap
map
undfilter
werden verwendet, umgenerieren Sie eine
Query
durch die wiederholte transformation vonQuery(Bars)
mit jedem Aufruf von
filter
undmap
. Im Fall vonSammlungen diese Methoden tatsächlich Durchlaufen und filtern Sie die Sammlung
aber Glatt sind Sie zum generieren von SQL. Mehr Informationen finden Sie hier:
Wie funktioniert Scala Slick übersetzen Scala-code in JDBC?
InformationsquelleAutor der Antwort Faiz
Da sonst niemand geantwortet hat, dies könnte helfen, um Ihnen den Einstieg. Ich weiß nicht, Slick sehr gut.
Aus der Slick Dokumentation:
In anderen Worten, slick muss wissen, wie man mit einer Zeile aus der Datenbank zurückgegeben. Die Methode, die Sie definiert ist verwendet Ihre parser combinator-Funktionen zu kombinieren, die Ihre Spalten-Definitionen in etwas, das verwendet werden kann, auf eine Zeile.
InformationsquelleAutor der Antwort Dominic Bou-Samra