Scala Slick:如何整洁地关闭资源和连锁反应

Scala Slick:如何整洁地关闭资源和连锁反应,scala,slick,slick-3.0,Scala,Slick,Slick 3.0,今天我写了一个小程序。它起作用了。这是密码 package com.abhi import slick.driver.MySQLDriver.api._ import slick.jdbc.meta.MTable import scala.concurrent.Future import scala.concurrent.ExecutionContext.Implicits.global import scala.util.{Success, Failure} object MySlickA

今天我写了一个小程序。它起作用了。这是密码

package com.abhi

import slick.driver.MySQLDriver.api._
import slick.jdbc.meta.MTable
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Success, Failure}

object MySlickApp extends App {
   val db = Database.forConfig("essential-slick ")
   val messages = TableQuery[MessageTable]

   val tableExists = MTable.getTables map { tables =>
      tables.exists(_.name.name == messages.baseTableRow.tableName)
   }

   val dropAction = messages.schema.drop
   val createAction = messages.schema.create

   val freshMessages = Seq(
      Message("Dave", "Hello HAL. Do you read me? HAL?"),
      Message("HAL", "Affirmtive, Dave. I read you."),
      Message("Dave", "Open the pod doors, HAL."),
      Message("HAL", "I'm Sorry. Dave. I'm afraid, I cannot do that.")
   )

   val insertAction = messages ++= freshMessages

   val f5 = for {
      f1 <- db.run(tableExists)
      f2 <- db.run(dropAction) if f1 == true
      f3 <- db.run(createAction)
      f4 <- db.run(insertAction)
   } yield (f1, f2, f3, f4)

   f5.onComplete{
      case Success(s) => println("table initialized successfully "); db.close
      case Failure(f) => println(f.getMessage); db.close
   }
   scala.io.StdIn.readLine()
}

final case class Message (sender: String, content: String, id: Long = 0L)

final case class MessageTable(tag: Tag) extends Table[Message](tag, "Message") {
   def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
   def sender = column[String]("sender")
   def content = column[String]("content")
   def * = (sender, content, id) <> (Message.tupled, Message.unapply)
}
package com.abhi
导入slick.driver.MySQLDriver.api_
导入slick.jdbc.meta.MTable
导入scala.concurrent.Future
导入scala.concurrent.ExecutionContext.Implicits.global
导入scala.util.{成功,失败}
对象MySlickApp扩展应用程序{
val db=Database.forConfig(“essential slick”)
val messages=TableQuery[MessageTable]
val tableExists=MTable.getTables映射{tables=>
tables.exists(uz.name.name==messages.baseTableRow.tableName)
}
val dropAction=messages.schema.drop
val createAction=messages.schema.create
val freshMessages=Seq(
留言(“戴夫”,“你好,哈尔。你听到我说的了吗?哈尔?”),
留言(“哈尔”,“肯定的,戴夫,我听到了。”),
信息(“戴夫”,“打开舱门,哈尔。”),
留言(“哈尔”,“对不起,戴夫,恐怕我做不到。”)
)
val insertAction=messages++=freshMessages
val f5=用于{
f1使用最新的slick 3.2
1.通过将DBIOActions链接在一起而不是将来,您可以将其作为单个db运行。通过这种方式,还可以将其作为事务运行:

val f = for {
     r1 <- tableExists
     r2 <- {
       if(r1){
             dropAction
          }else{ 
             DBIO.successful()
          }
        }
      r3 <- createAction
      r4 <- insertAction
   } yield (f)
db.run(f).transactionally
val f=for{

r1对于第二个子句,您可以在一个位置将关闭数据库的
onComplete()
组合在一起,而不重复。您能在第一个子句的数据库中显示您的结果吗?