如何使Squeryl与Play一起工作!框架?

时间:2012-05-11 22:54:54

标签: scala playframework playframework-2.0 squeryl

我正在尝试学习如何使用Play和Squeryl创建一个简单的数据库应用程序。我已经从Play教程制作了任务应用程序,但我想更改模型/架构,以便它使用Squeryl而不是Anorm。我一直在查看不同的tutorials,示例和answers,但我还没弄清楚如何做到这一点。

所以,考虑到来自Play Tutorial (ScalaTodoList)的源代码;我如何继续使用Squeryl?

更具体地说:

  • 如何在模型中实施all()create()delete()方法? (我想为任务使用自动递增ID)
  • 目前使用的数据库适配器是Build.scalaGlobal.scala中的硬编码(见下文)。我怎样才能使它自动使用H2进行开发/测试和Heroku上的Postgres,就像在Play教程中对Anorm一样?
  • 如何确保自动创建表格?

这是我到目前为止所做的

我已经完成了Play ScalaTodoList教程。

project/Build.scalaobject 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 answer,只是将适配器更改为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()delete()中的Anorm实现。 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教程结尾处。

2 个答案:

答案 0 :(得分:8)

以下是Squeryl的Play 2项目示例:
https://github.com/jamesward/play2bars/tree/scala-squeryl

答案 1 :(得分:4)

“Play for Scala”(MEAP)一书有一章关于Squeryl整合

http://www.manning.com/hilton/