2013-11-27 4 views
7

Есть ли способ получить пятно для создания базы данных, если она еще не существует?Слайк: создать базу данных

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

«базы данных» не существует, поэтому я хочу, чтобы пятно создавало его для меня. Есть идеи? Благодарю.

ответ

9

Вы можете подключить к двигателю базы данных, используя только "jdbc:mysql://localhost/" в JDBC URL, а затем выдает чистый SQL create database запрос:

import scala.slick.driver.MySQLDriver.simple._ 
import scala.slick.jdbc.{StaticQuery => Q} 

object Main extends App 
{ 
    Database.forURL("jdbc:mysql://localhost/", driver = "com.mysql.jdbc.Driver") withSession { 
     implicit session => 
      Q.updateNA("CREATE DATABASE `dataBaseName`").execute 
     . 
     . 
     . 
    } 
} 
+0

спасибо @ Răzvan, вы можете сказать, как сначала проверить, существует ли db? Кроме того, withSession устарела в slick 3, и я до сих пор не понял, что эквивалентно в новом API. Есть идеи? – kumetix

+0

Вы можете использовать http://stackoverflow.com/a/838993/750216. Для справки: http://grokbase.com/t/gg/scalaquery/15250knfya/slick-3-removes-withsession-dont-get-caught-by-surprise –

8

Ответ выше имеет отношение к 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)) 
    } 
} 
Смежные вопросы