2016-02-25 8 views
6

ich über DatabaseConfig in slick's documentation Lesen:Was ist der Unterschied zwischen der Verwendung von DatabaseConfig und Database in Slick?

Oben auf der Konfigurationssyntax für Database gibt es eine weitere Schicht in Form von DatabaseConfig, die Sie Database einen Slick-Treiber sowie eine passende zusammen konfigurieren können. Dies macht es einfach, abstrakte über verschiedene Arten von Datenbanksystemen durch einfaches Ändern einer Konfigurationsdatei.

Ich weiß nicht, diesen Teil bekommen, wie DatabaseConfig das zugrunde liegende Datenbanksystem abstrakter als der Database Ansatz macht? Nehmen wir an, ich bin mit DatabaseConfig im folgenden 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)) 
    } 
} 

Wie Sie sehen können, wenn ich von PostgreSQL zu MySQL meine zugrunde liegende Datenbanksystem ändern, zusätzlich zu den Konfigurationsänderung, ich brauche die import Anweisung zu ändern, dass Importiert die Postgre-API in MySQL. Auf der anderen Seite, wenn ich mit 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)) 
    } 
} 

Wenn ich Database bin mit, gleicher Änderung auf der zugrunde liegende Datenbank, würde in zwei Änderungen ergeben: ein in der Konfigurationsdatei und die andere im Quellcode. Mit all diesen Worten, wie ist ein Ansatz abstrakter als der andere? Verwende ich DatabaseConfig falsch?

Antwort

4

Sie sind in der Nähe, aber Sie verwenden DatabaseConfig nicht richtig. Anstatt einen bestimmten Treiber zu importieren, müssen Sie den der Konfiguration zugeordneten Treiber importieren. So etwas sollte funktionieren:

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

Diese erlauben sollten Sie Datenbanken in der Config zu wechseln, ohne Code oder neu kompilieren zu ändern.

+0

danke..aber wie kann ich 'dbConfig.driver.api._' in meinen Entity-Definitionen, z. "Lieferant"? Ich habe noch einige datenbankspezifische 'import' in diesen Klassen. –

+1

Es gibt ein paar verschiedene Möglichkeiten, wie Sie damit umgehen können. Sie könnten ein Objekt erstellen, das das Konfigurationsobjekt enthält, auf das die Entitätsdefinition zugreifen kann. Dann könnten Sie innerhalb der Schema-Entität "DbConfigHolderObject.dbConfig.driver.api._" importieren. Sie könnten auch ein Merkmal erstellen, das das Setup durchführt und es in die Schema-Entitäten mischt. – DemetriKots

+1

Nur daran gedacht ... Ich denke, der beste Weg, damit umzugehen, wäre wahrscheinlich, ein implizites zu verwenden. – DemetriKots