2016-02-25 3 views
6

Stavo leggendo su DatabaseConfig in slick's documentation:Qual è la differenza tra l'utilizzo di DatabaseConfig e Database in Slick?

In cima alla sintassi di configurazione per Database, c'è un altro strato sotto forma di DatabaseConfig che consente di configurare un driver Slick più una corrispondenza Database insieme. Questo semplifica l'astrazione di su diversi tipi di sistemi di database semplicemente modificando un file di configurazione .

Non capisco questa parte, come DatabaseConfig rende il sistema di database sottostante più astratto rispetto all'approccio Database? Supponiamo, sto usando DatabaseConfig nel seguente test:

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

Come si può vedere, se cambio il mio sistema di database sottostante da PostgreSQL a MySQL, oltre al cambiamento di configurazione, ho bisogno di modificare l'istruzione import che importa l'API di Postgre su mysql. D'altra parte, se stavo usando 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)) 
    } 
} 

Quando sto usando Database, stessa modifica sul database sottostante, si tradurrebbe in due cambi: uno nel file di configurazione e l'altro in codice sorgente. Con tutto ciò detto, come un approccio è più astratto dell'altro? Sto usando DatabaseConfig sbagliato?

risposta

4

Sei vicino, ma non stai utilizzando correttamente DatabaseConfig. Piuttosto che importare un driver specifico, è necessario importare il driver associato alla configurazione. Qualcosa del genere dovrebbe funzionare:

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

Ciò dovrebbe consentire di passare database nella configurazione senza dover cambiare alcun codice o di ricompilare.

+0

grazie..ma come posso utilizzare 'dbConfig.driver.api._' nelle definizioni delle entità, ad es. 'Supplier'? Ho ancora qualche importazione di database specifica in quelle classi. –

+1

Ci sono un paio di modi diversi per gestirlo. È possibile creare un oggetto per contenere l'oggetto config accessibile alla definizione dell'entità. Quindi all'interno dell'entità dello schema è possibile importare DbConfigHolderObject.dbConfig.driver.api._. È anche possibile creare una caratteristica che esegue l'installazione e combinarla nelle entità dello schema. – DemetriKots

+1

Pensavo solo a questo ... Penso che il modo migliore per gestirlo sarebbe probabilmente usare un implicito. – DemetriKots

Problemi correlati