【问题标题】:How to use type mappers with Slick Multi-DB Pattern?如何在 Slick Multi-DB Pattern 中使用类型映射器?
【发布时间】:2015-07-05 11:50:11
【问题描述】:

我正在使用 Slick 3.0 并遵循 Slick Multi-DB Pattern 以便抽象出实际的 DB 驱动程序。我使用在单个对象 TypeMappers 中定义的几种类型映射。现在我也想从特定的 DB 驱动程序中抽象出这些类型映射。这就是为什么我将 TypeMappers 移到专用 trait 中的原因。我相信这是正确的方法,但我正在努力如何导入 TypeMappers,以便类 User 可以看到隐式。任何帮助都会很棒。

trait TypeMappersTrait { this: Driver =>
  import driver.api._

  object TypeMappers {
    implicit val JavaUtilDateTypeMapper = MappedColumnType.base[java.util.Date, Long](_.getTime, new java.util.Date(_))
    implicit val URLMapper = MappedColumnType.base[URL, String](_.toString, new URL(_))
    implicit val WrappedByteArrayTypeMapper = MappedColumnType.base[WrappedArray[Byte], Array[Byte]](_.toArray, wrapByteArray(_))
  }
}


/** A User contains a name, picture and ID */
case class User(name: String, picture: Picture, id: Option[Int] = None)

/** UserComponent provides database definitions for User objects */
trait UserComponent { this: DriverComponent with PictureComponent =>
  import driver.simple._

  class Users(tag: Tag) extends Table[(String, Int, Option[Int])](tag, "USERS") {
    def id = column[Option[Int]]("USER_ID", O.PrimaryKey, O.AutoInc)
    def name = column[String]("USER_NAME", O.NotNull)
    def pictureId = column[Int]("PIC_ID", O.NotNull)
    def * = (name, pictureId, id)
  }
  val users = TableQuery[Users]

  private val usersAutoInc =
    users.map(u => (u.name, u.pictureId)) returning users.map(_.id)

  def insert(user: User)(implicit session: Session): User = {
    val pic =
      if(user.picture.id.isEmpty) insert(user.picture)
      else user.picture
    val id = usersAutoInc.insert(user.name, pic.id.get)
    user.copy(picture = pic, id = id)
  }
}

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    首先,我假设你在 TypeMappersTrait 中有错字,而 Driver 实际上应该是 DriverComponent (所以这个自类型匹配注释与 UserComponent) .

    然后您可以从对象 TypeMappers 中取消嵌套隐式类型映射器,以便它们直接位于 TypeMappersTrait 中,并通过以下方式将它们拉入:

    trait UserComponent extends TypeMappersTrait
    

    【讨论】:

    • 这几乎解决了我的问题,但我还必须导入类型映射器: trait UserComponent extends TypeMappersTrait { import TypeMappers._
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多