首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Slick 2:如何编写与数据库无关的DAL代码

Slick 2:如何编写与数据库无关的DAL代码
EN

Stack Overflow用户
提问于 2014-02-17 00:56:45
回答 2查看 938关注 0票数 0

这基本上是earlier question的重复,但是对于Slick-2,因为v.1的答案不再有效。

简而言之,精巧的文档建议这样做

代码语言:javascript
复制
package models
import scala.slick.driver.H2Driver.simple._

class Pictures(tag: Tag) extends Table[(Int, String, String)](tag, "Pictures") {
    def id = column[Int]("id", O.PrimaryKey)
    def urlThumb = column[String]("urlThumb", O.NotNull)
    def urlLarge = column[String]("urlLarge", O.NotNull)
    def * = (id, urlThumb, urlLarge)
}

这是将代码直接绑定到H2Driver。我希望它是与驱动无关的,即与任何JdbcProfile驱动程序一起工作。我找到的唯一方法就是将驱动程序传递给DAO类。

代码语言:javascript
复制
class SlickDAO(val driver: JdbcProfile) {
    import driver.simple._

问题是,如果我想用共享行为来定义一些特征,例如CRUDSupport,我不能对该特性进行参数化,我只能做一个抽象类。因此,我很好奇,推荐的用Slick-2编写DAL的方法是什么?我确信这是Cake模式,但我在Scala中还不够先进,无法实现它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-17 07:00:17

我不太清楚斯利克的具体情况,但是有一些标准的Scala方法可以解决这个问题。

我不能对这个特性进行争论,我只能做一个抽象的类

但你可以

代码语言:javascript
复制
trait SlickDAO {
  val driver: JdbcProfile

  import driver.simple._
  ...
}

以及以后的

代码语言:javascript
复制
class SlickDAOImpl(val driver: JdbcProfile) extends SlickDAO

代码语言:javascript
复制
 new SlickDAO {
   val driver = ...
 }

但是,在特征中使用抽象val可能会导致初始化顺序出现问题,因此我更倾向于

代码语言:javascript
复制
trait SlickDAO {
  // can still be implemented as a val
  def driver: JdbcProfile

  // can't import driver.simple._, you'll have to write the prefix explicitly
  ...
}

代码语言:javascript
复制
trait SlickDAO {
  def getDriver: JdbcProfile
  lazy val driver = getDriver

  import driver.simple._
  ...
}
票数 1
EN

Stack Overflow用户

发布于 2014-02-17 16:59:13

看看:http://knoldus.wordpress.com/?p=5228&preview=true和:https://github.com/satendrakumar06/slickformultipledatabases,这可能会有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21819018

复制
相关文章

相似问题

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