Je suis en train d'utiliser Lisse avec un Jeu 2.1 et j'ai quelques problèmes mineurs. Compte tenu de l'entité ci-dessous...
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 _)
}
... J'ai importer un package pour un spécifique pilote de base de données... mais je veux l'utiliser H2 pour les tests et PostgreSQL dans la production. J'ai été en mesure de contourner ceci en substituant les paramètres du pilote dans mon unité de test:
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
}
}
}
}
Personnellement je n'aime pas cette solution, et je me demandais si il est une manière élégante d'écrire DB-agnostique code.
Ensuite, un autre problème que j'ai est que je ne veux pas utiliser de l'évolution et préfère laisser la Nappe de créer les tables de la base pour moi:
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 première fois que je lance l'application, tout fonctionne bien... alors, bien sûr, la deuxième fois que je lance l'application, il se bloque parce que les tables existent déjà dans la base de données PostgreSQL. Cela dit, mes deux dernières questions sont les suivantes:
- Comment puis-je déterminer si oui ou non les tables de base de données existe déjà?
- Comment puis-je faire de l'
onStart
méthode ci-dessus DB-agnostique, afin que je puisse tester mon application avecFakeApplication
?
Toute aide serait vraiment appréciée ;-)