2017-08-09 1 views
0

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

} 

Répondre

0

Vous pouvez créer des fichiers de configuration distincts pour chaque environnement. comme

application.conf --local 

application.prod.conf -- prod with contents below 

include "aplication.conf" 
###update slick configurations 

Ensuite, alors que l'application en cours d'exécution en différentes étapes avec nourrir -Dconfig.resource=

+0

Merci beaucoup, @Sourav. Comment choisissez-vous l'environnement de l'application? –