2016-09-08 4 views
1

Ich folge der Scala Slick beginner guide versuchen, ein einfaches Schema zu erstellen, und ich kann nicht scheinen, die 'Spalte' Typ beim Importieren der Sachen am Anfang des zu finden Dokumentation.Slick 3.1.1 nicht gefunden Typ 'Spalte'

import slick.driver.H2Driver.api._ 
import scala.concurrent.ExecutionContext.Implicits.global 
/** 
    * Created by chris on 9/7/16. 
    */ 
class BlockHeaderTable(tag: Tag) extends Table[BlockHeader](tag,"block_headers") { 

    def version: column[UInt32] 

    def previousBlockHash: column[DoubleSha256Digest] 

    def merkleRootHash: column[DoubleSha256Digest] 

    def time: column[UInt32] 

    def nBits: column[UInt32] 

    def nonce: column[UInt32] 


} 

und hier ist der Fehler Ich erhalte:

chris @ chris-870Z5E-880Z5E-680Z5E: ~/dev/Bitcoins-SPV-Knoten $ sbt [info] Laden Projekt kompilieren Definition von /home/chris/dev/bitcoins-spv-knoten/projekt [info] Setze das aktuelle Projekt auf bitcoins-spv-node (in Build Datei:/home/chris/dev/bitcoins-spv-node /) [info] Kompilieren 1 Scala Quelle zu /home/chris/dev/bitcoins-spv-node/target/scala-2.11/classes ... [Fehler] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:14: nicht gefunden: Typ Spalte [Fehler] Def Version: Spalte [UInt32] [Fehler]
^ [Fehler] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:16: nicht gefunden: Typ Spalte [ Fehler] def previousBlockHash: Spalte [DoubleSha256Digest] [Fehler]^[Fehler] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:18 : nicht gefunden: Typ Spalte [Fehler] def merkleRootHash: Spalte [DoubleSha256Digest] [Fehler]^[Fehler] /home/chris/dev/Bitcoins-spv-Knoten/src/main/scala/org/bitcoins/spvnode/Modelle /BlockHeaderTable.scala:20: nicht gefunden: type column [Fehler] def time: Spalte [UInt32] [Fehler]
^ [Fehler] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala: 22: nicht gefunden: typ spalte [fehler] def nBits: spalte [UInt32] [fehler]
^ [fehler] /home/chris/dev/bitcoins -spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala: 24: nicht gefunden: typ spalte [fehler] def nonce: spalte [UInt32] [fehler]
^ [fehler] 6 Fehler gefunden [Fehler] (compile: compileIncremental) Kompilierung fehlgeschlagen

Antwort

2

Die Art der Spalten zu behandeln ist nicht column aber Rep.column ist tatsächlich eine Funktion, die glatt, welche Spalte sagt zu verwenden:

class BlockHeaderTable(tag: Tag) extends Table[BlockHeader](tag,"block_headers") { 

    def version: Rep[UInt32] = column[UInt32]("version") 

    def previousBlockHash: Rep[DoubleSha256Digest] = column[DoubleSha256Digest]("previous_block_hash") 

    ... 
} 

Auch ich bin nicht sicher, welche Arten Sie verwenden, aber die sind nicht aus der Box von Slick see here unterstützt. Sie müssen benutzerdefinierte Mapper schreiben. Zum Beispiel ein UInt32 Mapper:

implicit val UInt32Mapper = MappedColumnType.base[UInt32, Long](
    u => u.toLong,     // convert UInt32 to Long here 
    l => UInt32(l)     // and Long to UInt32 here 
) 
+0

Also im Grunde ist die Dokumentation falsch? –

+2

Die Dokumentation ist korrekt. Ich nehme an, du hast gerade ':' und '=' durcheinander gebracht. Ein Doppelpunkt deklariert einen Typ, während das Gleichheitszeichen einen Wert zuweist. – Roman

+0

Doh! Ich fühle mich jetzt wie ein Idiot. Danke :-) –

0

Slick wird keine benutzerdefinierten Typen außer JDBC-Standardtypen wie Timestamp, Long, String, Char, Boolean usw. verstehen. Um mit den benutzerdefinierten Typen arbeiten zu können, müssen Sie Slick Mapping von benutzerdefinierten Typen für jdbc-Typen bereitstellen.

Slick Mapping geben Sie für UInt32 und DoubleSha256Digest

Für Beispiel

DateTime ist individuelle Art, die Slick nicht versteht, aber glatt versteht java.sql.Timestamp .Wir eine glatte Abbildung liefern. So kann man erkennen, glatt verstehen, wie mit DateTime

implicit def jodaTimeMapping: BaseColumnType[DateTime] = MappedColumnType.base[DateTime, Timestamp](
dateTime => new Timestamp(dateTime.getMillis), 
timeStamp => new DateTime(timeStamp.getTime)) 

vollständigem Beispiel

case class Foo(str: String) //Foo needs Slick Mapping for below code to compile 

implicit def fooMapping: BaseColumnType[Foo] = MappedColumnType.base[Foo, String](
str => Foo(str), 
foo => foo.str) 


case class Person(name: String, foo: Foo) 

class Persons(tag) extends Table[Person](tag, "persons") { 
    def name = column[String]("name") 
    def foo = column[Foo]("foo") //use Foo directly because Implicit mapping is available in scope 
    def * = (name, foo) <> (Person.tupled, Person.unapply) 
} 
Verwandte Themen