gpt4 book ai didi

mysql - Play框架-通过URL中的参数将数据保存到数据库

转载 作者:行者123 更新时间:2023-11-30 00:39:57 25 4
gpt4 key购买 nike

我是 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 Controller

    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)

最佳答案

要传入多个记录的数据,并传入 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}]}

关于mysql - Play框架-通过URL中的参数将数据保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21850796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com