Slick 3.0.0 jeu 2.6.2Comment peut-Slick utiliser un pilote différent de base de données en fonction de l'environnement d'application (par exemple test, prod, etc.)
J'expérimente avec Slick et se dirigent vers une question intéressante. J'espère que la solution est juste triviale et je pense trop à ce sujet
J'ai implémenté le code simple suivant. Donc, pour que ce code fonctionne, il faut bien sûr que l'importation suivante soit effectuée entre autres.
import slick.jdbc.H2Profile.api._
ou bien
import slick.jdbc.PostgresProfile.api._
Maintenant, je pense, et s'il vous plaît me corriger si je me trompe, que le pilote de base de données devrait être un détail de configuration. Autrement dit, je choisirais d'exécuter H2 dans la base de données mémoire en cours de développement. Exécutez l'instance de test PostgreSQL lors du test, puis exécutez-la sur une autre instance en production. Je veux dire que l'idée d'abstraire le conducteur est d'avoir cette flexibilité ... je pense.
Maintenant, je l'ai fait quelques recherches et trouvé que je pouvais faire quelque chose comme ceci:
trait DbComponent {
val driver: JdbcProfile
import driver.api._
val db: Database
}
trait H2DbComponent extends DbComponent {
val driver: JdbcProfile = slick.jdbc.H2Profile
import driver.api._
val db = Database.forConfig("databaseConfiguration")
}
trait Contents {
def all: Seq[Content]
}
object Contents {
def apply: Contents = new ContentsDb with H2DbComponent
}
trait ContentsDb extends Contents {
this: DbComponent =>
import driver.api._
class ContentTable(tag: Tag) extends Table[Content](tag, "content") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def content = column[String]("content")
override def * : ProvenShape[Content] = content.mapTo[Content]
}
lazy val contents = TableQuery[ContentTable]
def all: Seq[Content] = Await.result(db.run(contents.result), 2 seconds)
}
Ensuite, je peux utiliser l'injection de dépendance pour injecter l'instance appropriée pour chaque entité que j'ai. Pas idéal, mais possible. Donc, je commence à creuser sur la façon d'avoir l'injection de dépendance conditionnelle en fonction de l'environnement qui s'exécute dans Play Framework.
Je me attendais quelque chose de semblable à ce qui suit:
@Component(env=("prod","test")
class ProductionContentsDb extends ContentsDb with PostgresDbComponent
@Component(env="dev")
class ProductionContentsDb extends ContentsDb with H2DbComponent
Mais, pas de chance ...
EDIT
Juste après avoir fini d'écrire cela et commencé à le lire à nouveau , Je suis curieux de savoir si nous pouvons avoir quelque chose de similaire à:
class DbComponent @Inject (driver: JdbcProfile) {
import driver.api._
val db = Database.forConfig("databaseConfiguration")
}
Merci beaucoup, @Sourav. Comment choisissez-vous l'environnement de l'application? –