Slick 3.1.1 未找到类型 'column'
Slick 3.1.1 not found type 'column'
我正在使用 Scala Slick beginner guide 尝试创建一个简单的模式,但在导入文档开头的内容时我似乎找不到 'column' 类型。
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]
}
这是我得到的错误:
chris@chris-870Z5E-880Z5E-680Z5E:~/dev/bitcoins-spv-node$ sbt compile
[info] Loading project definition from
/home/chris/dev/bitcoins-spv-node/project [info] Set current project
to bitcoins-spv-node (in build
file:/home/chris/dev/bitcoins-spv-node/) [info] Compiling 1 Scala
source to
/home/chris/dev/bitcoins-spv-node/target/scala-2.11/classes... [error]
/home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:14:
not found: type column [error] def version: column[UInt32] [error]
^ [error]
/home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:16:
not found: type column [error] def previousBlockHash:
column[DoubleSha256Digest] [error] ^ [error]
/home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:18:
not found: type column [error] def merkleRootHash:
column[DoubleSha256Digest] [error] ^ [error]
/home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:20:
not found: type column [error] def time: column[UInt32] [error]
^ [error]
/home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:22:
not found: type column [error] def nBits: column[UInt32] [error]
^ [error]
/home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:24:
not found: type column [error] def nonce: column[UInt32] [error]
^ [error] 6 errors found [error] (compile:compileIncremental)
Compilation failed
Slick 无法理解标准 JDBC 类型以外的自定义类型,例如 Timestamp、Long、String、Char、Boolean 等。为了使用自定义类型,您必须提供自定义类型的 Slick 映射jdbc 种。
为 UInt32
和 DoubleSha256Digest
提供灵活的映射
例如
DateTime
是slick不理解的自定义类型,但是slick理解java.sql.Timestamp
。我们提供了一个slick映射。这样 slick 就可以理解如何处理 DateTime
implicit def jodaTimeMapping: BaseColumnType[DateTime] = MappedColumnType.base[DateTime, Timestamp](
dateTime => new Timestamp(dateTime.getMillis),
timeStamp => new DateTime(timeStamp.getTime))
完整示例
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)
}
列的类型不是 column
,而是 Rep
。 column
实际上是一个函数,告诉slick使用哪一列:
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")
...
}
此外,我不确定您使用的是什么类型,但 slick see here 不支持开箱即用的类型。您将需要编写自定义类型映射器。例如 UInt32 映射器:
implicit val UInt32Mapper = MappedColumnType.base[UInt32, Long](
u => u.toLong, // convert UInt32 to Long here
l => UInt32(l) // and Long to UInt32 here
)
我正在使用 Scala Slick beginner guide 尝试创建一个简单的模式,但在导入文档开头的内容时我似乎找不到 'column' 类型。
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]
}
这是我得到的错误:
chris@chris-870Z5E-880Z5E-680Z5E:~/dev/bitcoins-spv-node$ sbt compile [info] Loading project definition from /home/chris/dev/bitcoins-spv-node/project [info] Set current project to bitcoins-spv-node (in build file:/home/chris/dev/bitcoins-spv-node/) [info] Compiling 1 Scala source to /home/chris/dev/bitcoins-spv-node/target/scala-2.11/classes... [error] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:14: not found: type column [error] def version: column[UInt32] [error]
^ [error] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:16: not found: type column [error] def previousBlockHash: column[DoubleSha256Digest] [error] ^ [error] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:18: not found: type column [error] def merkleRootHash: column[DoubleSha256Digest] [error] ^ [error] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:20: not found: type column [error] def time: column[UInt32] [error]
^ [error] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:22: not found: type column [error] def nBits: column[UInt32] [error]
^ [error] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:24: not found: type column [error] def nonce: column[UInt32] [error]
^ [error] 6 errors found [error] (compile:compileIncremental) Compilation failed
Slick 无法理解标准 JDBC 类型以外的自定义类型,例如 Timestamp、Long、String、Char、Boolean 等。为了使用自定义类型,您必须提供自定义类型的 Slick 映射jdbc 种。
为 UInt32
和 DoubleSha256Digest
例如
DateTime
是slick不理解的自定义类型,但是slick理解java.sql.Timestamp
。我们提供了一个slick映射。这样 slick 就可以理解如何处理 DateTime
implicit def jodaTimeMapping: BaseColumnType[DateTime] = MappedColumnType.base[DateTime, Timestamp](
dateTime => new Timestamp(dateTime.getMillis),
timeStamp => new DateTime(timeStamp.getTime))
完整示例
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)
}
列的类型不是 column
,而是 Rep
。 column
实际上是一个函数,告诉slick使用哪一列:
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")
...
}
此外,我不确定您使用的是什么类型,但 slick see here 不支持开箱即用的类型。您将需要编写自定义类型映射器。例如 UInt32 映射器:
implicit val UInt32Mapper = MappedColumnType.base[UInt32, Long](
u => u.toLong, // convert UInt32 to Long here
l => UInt32(l) // and Long to UInt32 here
)