在Slick中使用DatabaseConfig和Database之间的区别是什么?

时间:2016-02-25 19:23:04

标签: scala slick

我正在阅读slick's documentation中的$re = "/\\[(\\w+)\\]/"; $str = "[key]\n[key2]\n[key_asdf]"; $subst = "['$1']"; $result = preg_replace($re, $subst, $str);

  

除了DatabaseConfig的配置语法之外,还有另一个   Database形式的图层,允许您配置   光滑的驱动程序加上匹配的DatabaseConfig这很容易   通过简单地改变a来抽象不同类型的数据库系统   配置文件

我没有得到这一部分,Database如何使基础数据库系统比DatabaseConfig方法更抽象?假设我在以下测试中使用Database

DatabaseConfig

如您所见,如果我将基础数据库系统从import org.scalatest.{Matchers, FlatSpec} import slick.backend.DatabaseConfig import slick.driver.JdbcProfile import slick.driver.PostgresDriver.api._ import scala.concurrent.ExecutionContext.Implicits.global class DatabaseConfigTest extends FlatSpec with Matchers { def withDb(test: DatabaseConfig[JdbcProfile] => Any) = { val dbConfig = DatabaseConfig.forConfig[JdbcProfile]("abstract") try test(dbConfig) finally dbConfig.db.close() } "DatabaseConfig" should "work" in withDb { dbConfig => import Supplier._ val cities = suppliers.map(_.city) dbConfig.db.run(cities.result).map(_.foreach(println)) } } 更改为PostgreSQL,除了配置更改之外,我还需要更改导入postgre API的MySQL语句到mysql的。另一方面,如果我使用import

Database

当我使用import org.scalatest.{FlatSpec, Matchers} import slick.driver.PostgresDriver.api._ import slick.jdbc.JdbcBackend.Database import scala.concurrent.ExecutionContext.Implicits.global class DatabaseTest extends FlatSpec with Matchers { def withDb(test: Database => Any) = { val db = Database.forConfig("default") try test(db) finally db.close() } "Supplier names" should "be fetched" in withDb { db => import Supplier._ val names = suppliers.map(_.name) db.run(names.result).map(_.foreach(println)) } } 时,底层数据库上的相同更改将导致两个更改:一个在配置文件中,另一个在源代码中。说了这么多,一种方法比另一种更抽象?我使用Database错了吗?

1 个答案:

答案 0 :(得分:4)

你很近,但你并没有正确使用DatabaseConfig。您需要导入与配置关联的驱动程序,而不是导入特定的驱动程序。这样的事情应该有效:

import org.scalatest.{Matchers, FlatSpec}
import slick.backend.DatabaseConfig
import slick.jdbc.JdbcProfile
//import slick.driver.PostgresDriver.api._

import scala.concurrent.ExecutionContext.Implicits.global

class DatabaseConfigTest extends FlatSpec with Matchers {
  def withDb(test: DatabaseConfig[JdbcProfile] => Any) = {
    val dbConfig = DatabaseConfig.forConfig[JdbcProfile]("abstract")

    /* The api for the driver specified in the config is imported here. */
    import dbConfig.driver.api._  

    try test(dbConfig)
    finally dbConfig.db.close()
  }

  "DatabaseConfig" should "work" in withDb { dbConfig =>
    import Supplier._

    val cities = suppliers.map(_.city)

    dbConfig.db.run(cities.result).map(_.foreach(println))
  }
}

这应该允许您在配置中切换数据库,而无需更改任何代码或重新编译。