2017-08-09 3 views
0

スリック3.0.0 プレイ2.6.2はどのようにスリック(例えば、テスト、PRODなど)

私はスリックで実験し、興味深い問題が発生した午前のアプリケーション環境に基づいて、異なるデータベースドライバを使用することができます。私は解決策がほんとうに欲しいと思っており、これについてあまり考えすぎていると思います。

私は以下の簡単なコードを実装しました。

case class Content(content:String) 

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

object ContentDb { 
    val db = Database.forConfig("databaseConfiguration") 
    lazy val contents = TableQuery[ContentTable] 

    def all: Seq[Content] = Await.result(db.run(contents.result), 2 seconds) 
} 

このコードを動作させるには、もちろん次のようなインポートが必要です。

import slick.jdbc.H2Profile.api._ 

または代わり

import slick.jdbc.PostgresProfile.api._ 

は今、私が思うに、私はデータベースドライバは、構成の詳細であることを、間違っているなら、私を修正してください。つまり、開発中にメモリデータベースにH2を実行することを選択します。テスト時にはテストPostgreSQLインスタンスに対して実行し、本番環境では別のインスタンスに対して実行します。ドライバーを抽象化するという考えは、この柔軟性を持つことだと私は思います。

今、私はいくつかの研究を行って、私はこのような何かを行うことができることを発見した:

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) 

} 

その後、私は私が持っている各エンティティのための右のインスタンスを注入するために、依存性注入を使用することができます。理想的ではありませんが、可能です。ですから、私は、Play Frameworkでどの環境が実行されているかに基づいて条件付依存性注入を行う方法を掘り下げていきます。

私は、次のように何か期待していた:私はこれを書き終えて、再びそれを読み始めてきた直後

@Component(env=("prod","test") 
class ProductionContentsDb extends ContentsDb with PostgresDbComponent 

@Component(env="dev") 
class ProductionContentsDb extends ContentsDb with H2DbComponent 

しかし、運...

EDIT

を私たちがちょうど同じようなものを持っていれば私は興味があります。

class DbComponent @Inject (driver: JdbcProfile) { 

    import driver.api._ 

    val db = Database.forConfig("databaseConfiguration") 

} 

答えて

0

環境ごとに個別の構成ファイルを作成できます。その後

application.conf --local 

application.prod.conf -- prod with contents below 

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

のようなさまざまな段階で実行中のアプリケーションは-Dconfig.resource=

+0

で送りながら、非常に多くの@Sourav、ありがとうございました。アプリケーション内からどのような環境を選ぶのですか? –

関連する問題