Play Framework 2.1 でSlickを使用していますが、いくつか問題があります。
次のエンティティが与えられた場合...
package models
import scala.slick.driver.PostgresDriver.simple._
case class Account(id: Option[Long], email: String, password: String)
object Accounts extends Table[Account]("account") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def email = column[String]("email")
def password = column[String]("password")
def * = id.? ~ email ~ password <> (Account, Account.unapply _)
}
...特定のデータベース ドライバーのパッケージをインポートする必要がありますが、H2をテスト用に使用し、PostgreSQLを運用環境に使用したいと考えています。どのように進めればよいですか?
単体テストでドライバー設定をオーバーライドすることで、これを回避できました。
package test
import org.specs2.mutable._
import play.api.test._
import play.api.test.Helpers._
import scala.slick.driver.H2Driver.simple._
import Database.threadLocalSession
import models.{Accounts, Account}
class AccountSpec extends Specification {
"An Account" should {
"be creatable" in {
Database.forURL("jdbc:h2:mem:test1", driver = "org.h2.Driver") withSession {
Accounts.ddl.create
Accounts.insert(Account(None, "user@gmail.com", "Password"))
val account = for (account <- Accounts) yield account
account.first.id.get mustEqual 1
}
}
}
}
私はこの解決策が好きではありません.DBに依存しないコードを書くためのエレガントな方法があるかどうか疑問に思っています.2つの異なるデータベースエンジンが使用されています.1つはテスト用で、もう1つは本番用ですか?
私も進化を使いたくないので、Slick にデータベース テーブルを作成してもらいたいと思います。
import play.api.Application
import play.api.GlobalSettings
import play.api.Play.current
import play.api.db.DB
import scala.slick.driver.PostgresDriver.simple._
import Database.threadLocalSession
import models.Accounts
object Global extends GlobalSettings {
override def onStart(app: Application) {
lazy val database = Database.forDataSource(DB.getDataSource())
database withSession {
Accounts.ddl.create
}
}
}
最初にアプリケーションを起動すると、すべてが正常に機能します...もちろん、アプリケーションを 2 回目に起動すると、テーブルが PostgreSQL データベースに既に存在するため、アプリケーションがクラッシュします。
そうは言っても、私の最後の2つの質問は次のとおりです。
- データベース テーブルが既に存在するかどうかを確認するにはどうすればよいですか?
onStart
でアプリケーションをテストできるように、上記のメソッドを DB に依存しないようにするにはどうすればよいFakeApplication
ですか?