2016-02-25 52 views
6

我讀到有關DatabaseConfigslick'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)) 
    } 
} 

正如你可以看到,如果我將底層數據庫系統改變從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)) 
    } 
} 

當我使用Database,基礎數據庫相同的變化,會導致兩個變化:一個配置文件和其他源代碼。說到這一切,一種方法如何比另一種更抽象?我是否使用DatabaseConfig錯誤?

回答

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

這應該允許你切換在配置數據庫中,而無需更改任何代碼或重新編譯。

+0

thanks..but如何在我的實體定義中使用'dbConfig.driver.api._' 'Supplier'?在這些類中,我仍然有一些特定於數據庫的'import'。 –

+1

有幾種不同的方法可以處理這個問題。您可以創建一個對象來保存實體定義可訪問的配置對象。然後在模式實體中,您可以導入DbConfigHolderObject.dbConfig.driver.api._'。您也可以創建一個特性來完成設置並將其混合到模式實體中。 – DemetriKots

+1

想到這個......我認爲處理它的最好方法可能是使用隱式。 – DemetriKots

相關問題