首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Slick 3.1.1未找到“列”类型

Slick 3.1.1未找到“列”类型
EN

Stack Overflow用户
提问于 2016-09-08 01:26:42
回答 2查看 1.3K关注 0票数 1

我遵循Scala 初学者指南,试图创建一个简单的模式,在文档开头导入这些内容时,我似乎找不到“列”类型。

代码语言:javascript
复制
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编译信息从/home/chris/dev/位硬币-spv-节点/项目信息将当前项目设置为比特币-spv-节点(在构建文件中:/home/chris/dev/位硬币-spv-node/)信息编译一个Scala源代码到/home/chris/dev/bitcoins-spv-node/target/scala-2.11/classes...。错误/home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:14:未找到:输入列错误def版本: columnUInt32 ^ /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:16:未找到:键入列错误def previousBlockHash: columnDoubleSha256Digest ^ error previousBlockHash未找到:键入列错误def merkleRootHash: columnDoubleSha256Digest^ error /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:20:未找到:键入列错误指示时间: columnUInt32 ^ error /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:22:未找到:键入列错误def nBits: columnUInt32 ^ error /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderTable.scala:24:未找到:键入列错误def n: columnUInt32 ^ error 6发现错误编译失败

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-08 09:24:05

列的类型不是column,而是Repcolumn实际上是一个函数,它告诉slick使用哪一列:

代码语言:javascript
复制
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 请看这里不支持这些类型。您将需要编写自定义类型映射器。例如,一个UInt32映射程序:

代码语言:javascript
复制
implicit val UInt32Mapper = MappedColumnType.base[UInt32, Long](
  u => u.toLong,                  // convert UInt32 to Long here
  l => UInt32(l)                  // and Long to UInt32 here
)
票数 2
EN

Stack Overflow用户

发布于 2016-09-08 09:17:12

Slick将不理解标准JDBC类型以外的自定义类型,例如时间戳、Long、String、Char、Boolean等。为了处理自定义类型,您必须提供定制类型到jdbc类型的光滑映射。

UInt32DoubleSha256Digest提供光滑映射

,例如

DateTime是slick不理解的自定义类型,但是slick理解java.sql.Timestamp.We提供了光滑映射。这样就能理解如何处理DateTime

代码语言:javascript
复制
implicit def jodaTimeMapping: BaseColumnType[DateTime] = MappedColumnType.base[DateTime, Timestamp](
dateTime => new Timestamp(dateTime.getMillis),
timeStamp => new DateTime(timeStamp.getTime))

完整示例

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39381251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档