Я использую Slick с 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 в производство. Как мне продолжить?
Мне удалось обойти это, переопределив параметры драйвера в моем unit 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, "[email protected]", "Password"))
val account = for (account <- Accounts) yield account
account.first.id.get mustEqual 1
}
}
}
}
Мне не нравится это решение, и мне интересно, есть ли элегантный способ написания DB-агностического кода, поэтому используются два разных ядра базы данных: один в тестировании и другой в производстве?
Я тоже не хочу использовать эволюцию и предпочитаю, чтобы 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-agnostic, чтобы я мог проверить свое приложение с помощьюFakeApplication
?