8

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

因此,鉴于Play Tutorial (ScalaTodoList)的源代码;我如何继续使它与 Squeryl 一起工作?

进一步来说:

  • 如何在我的模型中实现all()create()delete()方法?(我想为任务使用自动递增的 ID)
  • 使用哪个数据库适配器当前是硬编码的Build.scalaGlobal.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 教程结束时的状态。

4

2 回答 2

8

这是一个使用 Squeryl 的 Play 2 项目示例:
https ://github.com/jamesward/play2bars/tree/scala-squeryl

于 2012-05-12T00:09:12.673 回答
4

“Play for Scala”(MEAP)一书中有一章介绍了 Squeryl 集成

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

于 2012-05-14T08:57:09.723 回答