为什么Scala不能找到参数scala.slick.session.Session的隐含值?

 手机用户2602931437 发布于 2023-02-08 08:05

我正在使用Slick 1.0.1运行Scala Play 2.2应用程序.我试图将所有数据库调用包装到将来的尝试中,例如:

object DbTeachers extends Table[DbTeacher]("edu_teachers") {
...
  def insertTeacher(school: Int, userId: String)
                   (implicit ec: ExecutionContext, db: Database) = 
    future { Try { db.withSession => { implicit s: Session =>
      (DbTeachers.school ~ DbTeachers.teacher).insert(school, userId)
  }}}
}

我发现该模式future { Try { db.withSession => { ACTUAL_CODE_GOES_HERE }}}会产生混乱,我想将其抽象如下:

sealed class DbAsync[T](block: => T) {
  import play.api.libs.concurrent.Execution.Implicits.defaultContext
  implicit lazy val db = Database.forDataSource(DB.getDataSource())
  def get: Future[Try[T]] = future { Try { db.withSession { implicit s: Session =>
    block 
  }}}
}

object DbAsync {
  def apply[T](block: => T): Future[Try[T]] = new DbAsync[T](block).get
}

然后我可以将insertTeacher函数编写为:

def insertTeacher(school: Int, userId: String) = DbAsync {
  (DbTeachers.school ~ DbTeachers.teacher).insert(school, userId)
}

但是,scala编译器(2.10.2)抱怨这个: could not find implicit value for parameter session: scala.slick.session.Session

根据我的理解,该insert()方法在DbAsync块中的范围内确实有一个隐式会话变量,并且因为它是一个按名称调用的参数,所以在DbAsync中调用它之前不应该对它进行实际评估.范围内会有一个隐含的会话对象.

所以,我的问题是,如何说服Scala编译器在范围内实际存在隐式Session对象?

1 个回答
  • 你的建议不正确.无论在何处call-by-name评估参数都无关紧要.所有隐式参数都应在编译时在需要它们的地方解析.

    你可以这样工作:

    def dbAsync[T](block: Session => T): Future[Try[T]] = {
      import play.api.libs.concurrent.Execution.Implicits.defaultContext
      implicit lazy val db = Database.forDataSource(DB.getDataSource())
      future { Try { db.withSession { block }}}
    }
    
    def insertTeacher(school: Int, userId: String) = dbAsync { implicit s: Session =>
      (DbTeachers.school ~ DbTeachers.teacher).insert(school, userId)
    }
    

    请注意,您不需要类DbAsync或对象DbAsync.

    请注意,您不应该使用defaultContext阻止操作.您可以ExecutionContext使用配置的线程池创建其他内容.

    2023-02-08 08:18 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有