我正在尝试学习如何使用 Play 和 Squeryl 制作一个简单的数据库应用程序。我已经从 Play 教程中制作了 Tasks 应用程序,但我想更改模型/架构,以便它使用 Squeryl 而不是 Anorm。我一直在查看不同的教程、示例和答案,但我还没有真正弄清楚如何做到这一点。
因此,鉴于Play Tutorial (ScalaTodoList)的源代码;我如何继续使它与 Squeryl 一起工作?
进一步来说:
- 如何在我的模型中实现
all()
、create()
和delete()
方法?(我想为任务使用自动递增的 ID) - 使用哪个数据库适配器当前是硬编码的
Build.scala
(Global.scala
见下文)。我怎样才能让它自动使用 H2 进行开发/测试和 Heroku 上的 Postgres,就像 Play 教程中的 Anorm 一样? - 如何确保它自动创建我的表?
这是我到目前为止所做的
我已经完成了 Play ScalaTodoList 教程。
在project/Build.scala
,object ApplicationBuild
中,我添加了依赖项:
// From the "Squeryl Getting Started tutorial"
val posgresDriver = "postgresql" % "postgresql" % "8.4-702.jdbc4"
val h2 = "com.h2database" % "h2" % "1.2.127"
// From the "Squeryl Getting Started tutorial"
libraryDependencies ++= Seq(
"org.squeryl" %% "squeryl" % "0.9.5",
h2
)
// From the Play tutorial
val appDependencies = Seq(
// Add your project dependencies here,
"org.squeryl" %% "squeryl" % "0.9.5", // Copied from above so that it compiles (?)
"postgresql" % "postgresql" % "8.4-702.jdbc4"
)
添加app/Global.scala
(取自上面提到的SO 答案,只是将适配器更改为 H2):
import play.db.DB
import play.api.Application
import play.api.GlobalSettings
import org.squeryl._
import org.squeryl.adapters._
object Global extends GlobalSettings {
override def onStart(app: Application): Unit =
{
SessionFactory.concreteFactory = Some(
() => Session.create(DB.getDataSource().getConnection(),
dbAdapter));
}
override def onStop(app: Application): Unit =
{
}
val dbAdapter = new H2Adapter(); // Hard coded. Not good.
}
在中,app/models/Task.scala
我添加了导入并删除了all()
、create()
和中的 Anorm 实现delete()
。Play 教程中的控制器期望该all()
方法返回List[Task]
。
import org.squeryl.PrimitiveTypeMode._
import org.squeryl.Schema
import org.squeryl.annotations.Column
case class Task(id: Long, label: String)
object Task extends Schema {
val tasks = table[Task] // Inspired by Squeryl tutorial
def all(): List[Task] = {
List[Task]() // ??
}
def create(label: String) {
// ??
}
def delete(id: Long) {
// ??
}
}
其余文件保留在 Play 教程结束时的状态。