如何让 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.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 教程结束时的状态。

【问题讨论】:

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 一起工作!框架?的主要内容,如果未能解决你的问题,请参考以下文章

更新如何与 Ebean 和 Play 框架一起使用

玩! @Before、traits 和 Squeryl 抛出关闭连接的问题?

如何让 `page-break-inside: Avoid` 与 `flex-wrap: wrap` 一起工作

Scala 反射和 Squeryl

如何设置 sbt/scala/play 多模块项目,该项目将与 Intellij scala 插件一起正常工作

如何让 Excel 加载项 (Excel 2007) 中的用户定义函数与自动完成功能一起使用?