在Slick中使用DatabaseConfig和Database有什么区别?

Ali*_*ani 6 scala slick

我正在读关于DatabaseConfig光滑的文档:

除了配置语法之外Database,还有另一个层,其形式DatabaseConfig允许您配置Slick驱动程序和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))
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,如果我将基础数据库系统从更改PostgreSQLMySQL,除了配置更改之外,我还需要更改import将postgre API导入mysql的语句.另一方面,如果我使用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))
  }
}
Run Code Online (Sandbox Code Playgroud)

当我使用时Database,底层数据库上的相同更改将导致两个更改:一个在配置文件中,另一个在源代码中.说了这么多,一种方法比另一种更抽象?我用DatabaseConfig错了吗?

Dem*_*ots 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))
  }
}
Run Code Online (Sandbox Code Playgroud)

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