如何让 Squeryl 与 Play 一起工作!框架?
Posted
技术标签:
【中文标题】如何让 Squeryl 与 Play 一起工作!框架?【英文标题】:How to make Squeryl work with the Play! Framework? 【发布时间】:2012-05-11 22:54:53 【问题描述】:我正在尝试学习如何使用 Play 和 Squeryl 制作一个简单的数据库应用程序。我已经从 Play 教程中制作了 Tasks 应用程序,但我想更改模型/架构,以便它使用 Squeryl 而不是 Anorm。我一直在查看不同的tutorials、示例和answers,但我还没有真正弄清楚如何做到这一点。
所以,给定源代码来自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 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 教程结束时的状态。
【问题讨论】:
Artima 的本教程是可遵循的,并在 Scala 中使用 Play2 和 Squeryl。这应该正是您需要的:artima.com/articles/play2_scala_squeryl.html 【参考方案1】:这是一个使用 Squeryl 的 Play 2 项目示例:https://github.com/jamesward/play2bars/tree/scala-squeryl
【讨论】:
非常感谢! :) 但是我在运行您的项目时确实遇到了一些问题。以下是我解决它们的方法:克隆 正确 分支(而不是主分支)git clone https://github.com/jamesward/play2bars.git -b scala-squeryl
然后为了解决 Jquery 依赖问题,我必须将 project/Build.scala
中的第 13 行从 "com.jquery" % "jquery" % "1.7.1"
更改为"com.jquery" % "jquery" % "1.7.1" from "http://code.jquery.com/jquery-1.7.1.min.js"
.
抱歉,我已经在 git repo 中修复了这个问题。
关于该示例的博客文章 artima.com/articles/play2_scala_squeryl.html【参考方案2】:
“Play for Scala”(MEAP) 书中有一章介绍了 Squeryl 集成
http://www.manning.com/hilton/
【讨论】:
以上是关于如何让 Squeryl 与 Play 一起工作!框架?的主要内容,如果未能解决你的问题,请参考以下文章
玩! @Before、traits 和 Squeryl 抛出关闭连接的问题?
如何让 `page-break-inside: Avoid` 与 `flex-wrap: wrap` 一起工作