gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:41:20 24 4
gpt4 key购买 nike

我在slick's documentation中阅读了有关DatabaseConfig的内容:

On top of the configuration syntax for Database, there is another layer in the form of DatabaseConfig which allows you to configure a Slick driver plus a matching Database together. This makes it easy to abstract over different kinds of database systems by simply changing a configuration file.

我不明白这部分,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,除了配置更改之外,我还需要更改 import 将 postgre API 导入 mysql 的语句。另一方面,如果我使用数据库:

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))
}
}

当我使用数据库时,对底层数据库的相同更改将导致两项更改:一项在配置文件中,另一项在源代码中。综上所述,一种方法如何比另一种更抽象?我使用 DatabaseConfig 是否错误?

最佳答案

你已经很接近了,但是你还没有正确使用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))
}
}

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

关于scala - 在 Slick 中使用 DatabaseConfig 和 Database 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35636436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com