【问题标题】:Play framework - save data to database by parameters in URL播放框架 - 通过 URL 中的参数将数据保存到数据库
【发布时间】:2014-02-18 10:25:03
【问题描述】:

我是 Play 框架和 Scala 语言的新手。我只想通过运行带有指定参数的 URL 来将一些数据保存到数据库中。 例如我想像这样运行 url:

/DeviceData?device_ID=1&insertDate=2013-01-01&windDirection=50&device_ID=1&insertDate=2013-01-02&windDirection=5

然后在数据库中插入两条新记录(使用 Device_ID、insertDate 和 windDirection)。 现在我试图一次只保存一条记录(我不知道如何读取元素列表并保存它们)但是它不起作用。没有错误,只是没有插入。

设备数据模型

    case class DeviceData(data_ID: Long, device_ID: Long, insertDate: String, windDirection: Double)

object DeviceData{
    var deviceDataList = new HashMap[Long, DeviceData]
    var data_ID = 0L

    def nextId(): Long = { data_ID += 1; data_ID}

    def createDeviceData(device_ID: Long, insertDate: String, windDirection: Double) :Unit = { 
        DB.withConnection { implicit connection =>
            SQL(
                """
                    INSERT INTO devicedata(device_ID, insertDate, windDirection) 
                    VALUES ({device_ID}, {insertDate}, {windDirection})
                """
            ).
            on("device_ID" -> device_ID, "insertDate" -> insertDate, "windDirection" -> windDirection).
            executeInsert()
        }
    }

    def list(): List[DeviceData] = { deviceDataList.values.toList }
}

DeviceDatas 控制器

    object DeviceDatas extends Controller {

  val deviceDataForm = Form(
    tuple(
      "device_ID" -> of[Long],
      "insertDate" -> nonEmptyText,
      "windDirection" -> of[Double]
    )
  )

  def listDeviceData() = Action {
    Ok(views.html.deviceData(DeviceData.list(), deviceDataForm))
  }

    def createDeviceData(device_ID: Long, insertDate: String, windDirection: Double) = Action { implicit request =>
      deviceDataForm.bindFromRequest.fold(
        errors => BadRequest(views.html.deviceData(DeviceData.list(), errors)),
        { case (device_ID, insertDate, windDirection) => {
            DeviceData.createDeviceData(device_ID, insertDate, windDirection)
            Redirect(routes.DeviceDatas.listDeviceData)
          }
        }
     )
  }
}

deviceData.scala.html - 很简单,就是检查是否有新插入的记录。

    @(deviceDatas: List[DeviceData], deviceDataForm: Form[(Long, String, Double)])

@import helper._

@main("DeviceDatas"){
    <h3>@deviceDatas.size DeviceData(s)</h3>
}

/deviceDatas 的路由文件

 GET    /deviceDatas                controllers.DeviceDatas.listDeviceData
POST    /deviceDatas                controllers.DeviceDatas.createDeviceData(device_ID: Long, insertDate: String, windDirection: Double)

您能否帮助我了解如何将数据插入数据库,以及是否有可能放入包含少量记录的元素列表以插入。另外,将 DateTime (yyyy-MM-dd hh:mm:ss) 插入 Play Framework 中的 URL 参数的最佳方法是什么?我被卡住了,我不知道该怎么做。

更新

感谢 Zim-Zam O'Pootertoot 的回答。不幸的是我需要使用参数,因为我通过路由器发送数据。但无论如何,还要感谢你,因为我将来会使用 json。 我决定不使用我之前所说的参数列表,但是对于一条新记录,我正在发送一个请求(例如:要向数据库添加 6 条新记录,我需要在路由器上运行 6 次 URL:

/DeviceData?device_ID=1&insertDate=2013-01-01&windDirection=50

我的问题通过将路由文件更改为:

GET     /deviceDatas                controllers.DeviceDatas.listDeviceData
GET     /deviceDatas                controllers.DeviceDatas.createDeviceData(device_ID: Long, insertDate: String, windDirection: Double)

【问题讨论】:

  • 您收到什么错误?
  • 没有错误,只是什么也没发生,记录没有添加到数据库中

标签: mysql scala playframework-2.2


【解决方案1】:

要传入多条记录的数据,还要传入 DateTime 数据,请在请求的 json 正文中发送数据,而不是作为 url 参数发送

http://www.playframework.com/documentation/2.2.x/ScalaBodyParsers

http://www.playframework.com/documentation/2.2.x/ScalaJson

Action(parse.json) { implicit request => 
  (request.body \ "records") match {
    case arr: JsArray => arr.value.foreach(json => {
      val deviceId = (json \ "device_ID").as[Long]
      val date = (json \ "insertDate").as[String]
      val windDirection = (json \ "windDirection").as[Double]
      // insert data in database
    })
    case _ => throw new IllegalArgumentException("Invalid Json: records must be a JsArray")
}}

用于记录的 json 可能类似于

{"records" : [
  {"device_ID" : 123, "insertDate" : "2014-03-01 12:00:00", "windDirection" : 123.45},
  {"device_ID" : 456, "insertDate" : "2014-03-02 12:00:00", "windDirection" : 54.321}]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2021-03-08
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多