scala - 光滑:创建数据库

标签 scala slick

如果数据库尚不存在,有没有办法轻松创建数据库?

Database.forURL("jdbc:mysql://127.0.0.1/database", driver = "com.mysql.jdbc.Driver", user = "root") withSession {
  // create tables, insert data
}

“数据库”不存在,所以我希望 slick 为我创建它。有任何想法吗?谢谢。

最佳答案

上面的答案与 Slick 2.x 相关,其中 withSession 已被弃用, 这就是 Slick 3.0.0 API 的实现方式:

import scala.concurrent.Await
import scala.concurrent.duration._
import org.postgresql.util.PSQLException
import slick.driver.PostgresDriver
import slick.driver.PostgresDriver.api._

object SlickPGUtils {

  private val actionTimeout = 10 second
  private val driver = "org.postgresql.Driver"

  def createDb(host: String, port: Int, dbName: String, user: String, pwd: String) = {
    val onlyHostNoDbUrl = s"jdbc:postgresql://$host:$port/"
    using(Database.forURL(onlyHostNoDbUrl, user = user, password = pwd, driver = driver)) { conn =>
      Await.result(conn.run(sqlu"CREATE DATABASE #$dbName"), actionTimeout)
    }
  }

  def dropDb(host: String, port: Int, dbName: String, user: String, pwd: String) = {
    val onlyHostNoDbUrl = s"jdbc:postgresql://$host:$port/"
    try {
      using(Database.forURL(onlyHostNoDbUrl, user = user, password = pwd, driver = driver)) { conn =>
        Await.result(conn.run(sqlu"DROP DATABASE #$dbName"), actionTimeout)
      }
    } catch {
      // ignore failure due to db not exist
      case e:PSQLException => if (e.getMessage.equals(s""""database "$dbName" does not exist""")) {/* do nothing */}
      case e:Throwable => throw e // escalate other exceptions
    }
  }

  private def using[A <: {def close() : Unit}, B](resource: A)(f: A => B): B =
    try {
      f(resource)
    } finally {
      Try {
        resource.close()
      }.failed.foreach(err => throw new Exception(s"failed to close $resource", err))
    }
}

关于scala - 光滑:创建数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20247742/

相关文章:

scala - 无法复制具有重复参数的案例类

scala - play - 如何用 futures 包装阻塞代码

scala - 在 Slick 中插入

scala - 在 Scala 中保持全局应用程序状态的好策略是什么?

scala - 如何通过 SQLException : Attempting to obtain a connection from a pool that has already been shutdown

scala - 按ID滑动选择行

android - 在 sbt android 项目中使用我的 java 项目 jar

scala - Sbt 测试在使用 Scalaz 时抛出 IncompatibleClassChangeError

java - 使用Mysql ClusterJ jar文件连接到NDB集群

scala - 为 Slick 3.1.1 创建通用更新功能