【发布时间】:2016-02-25 19:23:03
【问题描述】:
我在slick's documentation 中阅读了有关DatabaseConfig 的信息:
在
Database的配置语法之上,还有另一个DatabaseConfig形式的层,它允许您配置一个 光滑的驱动程序加上一个匹配的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 更改为MySQL,除了配置更改之外,我还需要更改将postgre API 导入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 时,对底层数据库的相同更改将导致两个更改:一个在配置文件中,另一个在源代码中。综上所述,一种方法比另一种更抽象吗?我用DatabaseConfig错了吗?
【问题讨论】: