我正在尝试学习如何使用 Play 和 Squeryl 制作一个简单的数据库应用程序。我已经根据 Play 教程制作了任务应用程序,但我想更改模型/架构,以便它使用 Squeryl 而不是 Anorm。我一直在寻找不同的教程 http://squeryl.org/getting-started.html、示例和answers https://stackoverflow.com/a/9706308/1390113,但我还没有真正弄清楚如何做到这一点。
因此,鉴于源代码来自播放教程(ScalaTodoList) http://www.playframework.org/documentation/2.0.1/ScalaTodoList;我该如何继续使其与 Squeryl 一起工作?
进一步来说:
- 我如何实施
all()
, create()
, and delete()
我的模型中的方法? (我想对任务使用自动递增 ID)
- 当前使用哪个数据库适配器是硬编码的
Build.scala
and Global.scala
(见下文)。我怎样才能让它自动使用 H2 进行开发/测试并在 Heroku 上使用 Postgres,就像 Play 教程中的 Anorm 一样?
- 如何确保它自动创建我的表?
这就是我到目前为止所做的
我已经完成了 Play ScalaTodoList 教程。
In 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"
)
added app/Global.scala
(取自所以答案 https://stackoverflow.com/a/9706308/1390113上面提到,只是将适配器更改为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.
}
in app/models/Task.scala
我添加了导入并删除了 Anorm 实现all()
, create()
, and 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 教程末尾的位置。