我讀到有關DatabaseConfig
在slick's documentation:在Slick中使用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
,除了配置變化,我需要改變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))
}
}
當我使用Database
,基礎數據庫相同的變化,會導致兩個變化:一個配置文件和其他源代碼。說到這一切,一種方法如何比另一種更抽象?我是否使用DatabaseConfig
錯誤?
thanks..but如何在我的實體定義中使用'dbConfig.driver.api._' 'Supplier'?在這些類中,我仍然有一些特定於數據庫的'import'。 –
有幾種不同的方法可以處理這個問題。您可以創建一個對象來保存實體定義可訪問的配置對象。然後在模式實體中,您可以導入DbConfigHolderObject.dbConfig.driver.api._'。您也可以創建一個特性來完成設置並將其混合到模式實體中。 – DemetriKots
想到這個......我認爲處理它的最好方法可能是使用隱式。 – DemetriKots