¿Cómo escribir la aplicación Play de base en la base de datos y realizar la primera inicialización de la base de datos?

Estoy usandoMancha con unMarco de juego 2.1 y tengo algunos problemas.

Dada la siguiente entidad ...

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 _)
}

... Tengo que importar un paquete para unespecífico controlador de base de datos, pero quiero usarH2 parapruebas yPostgreSQL enproducción. ¿Cómo debo proceder?

Pude solucionar esto porprimordial la configuración del controlador en mi prueba de unidad:

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

No me gusta esta solución y me pregunto si hay una manera elegante de escribir código sin base de datos de DB, por lo que se usan dos motores de base de datos diferentes, ¿uno en pruebas y otro en producción?

Tampoco quiero usar evolution, y prefiero dejar que Slick cree las tablas de la base de datos por mí:

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

La primera vez que inicio la aplicación, todo funciona bien ... luego, por supuesto, la segunda vez que inicio la aplicación se bloquea porque las tablas ya existen en la base de datos PostgreSQL.

Dicho esto, mis dos últimas preguntas son:

¿Cómo puedo determinar si las tablas de la base de datos ya existen o no?¿Cómo puedo hacer elonStart Método anterior a DB-agnóstico para que pueda probar mi aplicación conFakeApplication?

Respuestas a la pregunta(4)

Su respuesta a la pregunta