Как написать независимое от базы данных приложение Play и выполнить первоначальную инициализацию базы данных?

я используюскользкий сPlay Framework 2.1 а у меня некоторые проблемы.

Учитывая следующую сущность ...

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, "[email protected]", "Password"))
        val account = for (account <- Accounts) yield account
        account.first.id.get mustEqual 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
    }
  }
}

В первый раз, когда я запускаю приложение, все работает нормально ... затем, конечно, во второй раз, когда я запускаю приложение, оно падает, потому что таблицы уже существуют в базе данных PostgreSQL.

Тем не менее, мои последние два вопроса:

Как я могу определить, существуют ли таблицы базы данных?Как я могу сделатьonStart метод выше DB-агностик, так что я могу проверить свое приложение сFakeApplication?

Ответы на вопрос(4)

Ваш ответ на вопрос