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 vonDatabaseConfig
, die SieDatabase
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?
danke..aber wie kann ich 'dbConfig.driver.api._' in meinen Entity-Definitionen, z. "Lieferant"? Ich habe noch einige datenbankspezifische 'import' in diesen Klassen. –
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
Nur daran gedacht ... Ich denke, der beste Weg, damit umzugehen, wäre wahrscheinlich, ein implizites zu verwenden. – DemetriKots