如何将类型映射器与 Slick 多数据库模式一起使用?
How to use type mappers with Slick Multi-DB Pattern?
我正在使用 Slick 3.0 并遵循 Slick Multi-DB Pattern 以便抽象出实际的数据库驱动程序。我使用在单个对象 TypeMappers 中定义的多个类型映射。现在我也想从特定的数据库驱动程序中抽象出这些类型映射。这就是为什么我将 TypeMappers 移到专用特征中的原因。我相信这是正确的方法,但我正在努力如何导入 TypeMappers 以便 class 用户可以看到隐式。任何帮助都会很棒。
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)
}
}
首先,我假设您在 TypeMappersTrait 中输入错误,Driver 实际上应该是 DriverComponent(所以这个 self -type 将注解与 UserComponent 相匹配)。
然后您可以从对象 TypeMappers 中取消嵌套您的隐式类型映射器,以便它们直接位于 TypeMappersTrait 中,并通过以下方式将它们拉入:
trait UserComponent extends TypeMappersTrait
我正在使用 Slick 3.0 并遵循 Slick Multi-DB Pattern 以便抽象出实际的数据库驱动程序。我使用在单个对象 TypeMappers 中定义的多个类型映射。现在我也想从特定的数据库驱动程序中抽象出这些类型映射。这就是为什么我将 TypeMappers 移到专用特征中的原因。我相信这是正确的方法,但我正在努力如何导入 TypeMappers 以便 class 用户可以看到隐式。任何帮助都会很棒。
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)
}
}
首先,我假设您在 TypeMappersTrait 中输入错误,Driver 实际上应该是 DriverComponent(所以这个 self -type 将注解与 UserComponent 相匹配)。
然后您可以从对象 TypeMappers 中取消嵌套您的隐式类型映射器,以便它们直接位于 TypeMappersTrait 中,并通过以下方式将它们拉入:
trait UserComponent extends TypeMappersTrait