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 diDatabaseConfig
che consente di configurare un driver Slick più una corrispondenzaDatabase
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?
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. –
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
Pensavo solo a questo ... Penso che il modo migliore per gestirlo sarebbe probabilmente usare un implicito. – DemetriKots