scala slick 不持久化数据
scala slick does not persist data
我有以下代码不起作用...不起作用意味着在这种情况下它不会保留在数据库中....
DTO/DAO
def createChangelogEntry(changeLog: ChangelogModel): Future[ChangelogModel] = {
println("..........................................")
println(changeLog)
val entry =
(changelogs returning changelogs.map(_.id)
into ((log,id) => log.copy(id=Some(id)))
) += ChangelogModel(None, changeLog.createdat, changeLog.text)
db.run(entry)
}
在这种情况下可能是什么问题?模型上的匹配工作正常......
U更新:
SQL:
CREATE TABLE Changelog (
id BIGINT(255) NOT NULL,
createdat DATETIME NOT NULL,
text text NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
我的模特:
package models
import java.sql.Date
import play.api.libs.json.{JsValue, Json, Writes}
/**
* Created by Felix Hohlwegler on 08.06.2017.
*/
case class ChangelogModel(
id: Option[Int] = None,
createdat: String,
text: String
)
object ChangelogModel {
implicit val changelogFormat = Json.format[ChangelogModel]
}
控制器功能:
package controllers
import javax.inject.{Inject, Singleton}
import dto.changelogDTO
import models.{ChangelogModel, ProcessTemplatesModel}
import play.api.libs.json.{JsError, JsSuccess, Json}
import play.api.mvc.{Action, AnyContent, Controller, Request}
import scala.concurrent.Future
/**
* Created by Felix Hohlwegler on 08.06.2017.
*/
@Singleton
class Changelogs @Inject()(changelogDTO: changelogDTO) extends Controller {
def createChangelogEntry = Action { implicit request =>
request.body.asJson.map(_.validate[ChangelogModel] match {
case JsSuccess(process, _) =>
changelogDTO.createChangelogEntry(process)
case err@JsError(_) => BadRequest("TEST")
case _ => BadRequest("fail to create Counter")
}).getOrElse(BadRequest("Failure tu create Counter"))
Ok("s")
}
}
一个问题是您没有等待控制器完成插入:
// Problem
case JsSuccess(process, _) => changelogDTO.createChangelogEntry(process)
您应该映射未来并 return 像这样异步地获取其结果:
// Do this
case JsSuccess(process, _) => changelogDTO.createChangelogEntry(process).map(model => Ok(Json.toJson(model))
然而,这将意味着您也需要所有其他情况 return 期货,并且您必须将结果操作更改为 by async。我会这样做:
def createChangelogEntry = Action.async(parse.json) { implicit request =>
request.body.validate[ChangelogModel].fold(
errors => Future(BadRequest(JsError.toJson(errors))),
changelogModel => changelogDTO.createChangelogEntry(changelogModel).map(model => Ok(Json.toJson(model))
)
}
与此同时,您可能会发现将当前的插入内容包装在 Await.result
中更容易调试,如下所示:
import scala.concurrent.duration._
case JsSuccess(process, _) =>
val model = Await.result(changelogDTO.createChangelogEntry(process), 5 seconds)
Ok("We inserted the thing")
我有以下代码不起作用...不起作用意味着在这种情况下它不会保留在数据库中....
DTO/DAO
def createChangelogEntry(changeLog: ChangelogModel): Future[ChangelogModel] = {
println("..........................................")
println(changeLog)
val entry =
(changelogs returning changelogs.map(_.id)
into ((log,id) => log.copy(id=Some(id)))
) += ChangelogModel(None, changeLog.createdat, changeLog.text)
db.run(entry)
}
在这种情况下可能是什么问题?模型上的匹配工作正常......
U更新:
SQL:
CREATE TABLE Changelog (
id BIGINT(255) NOT NULL,
createdat DATETIME NOT NULL,
text text NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
我的模特:
package models
import java.sql.Date
import play.api.libs.json.{JsValue, Json, Writes}
/**
* Created by Felix Hohlwegler on 08.06.2017.
*/
case class ChangelogModel(
id: Option[Int] = None,
createdat: String,
text: String
)
object ChangelogModel {
implicit val changelogFormat = Json.format[ChangelogModel]
}
控制器功能:
package controllers
import javax.inject.{Inject, Singleton}
import dto.changelogDTO
import models.{ChangelogModel, ProcessTemplatesModel}
import play.api.libs.json.{JsError, JsSuccess, Json}
import play.api.mvc.{Action, AnyContent, Controller, Request}
import scala.concurrent.Future
/**
* Created by Felix Hohlwegler on 08.06.2017.
*/
@Singleton
class Changelogs @Inject()(changelogDTO: changelogDTO) extends Controller {
def createChangelogEntry = Action { implicit request =>
request.body.asJson.map(_.validate[ChangelogModel] match {
case JsSuccess(process, _) =>
changelogDTO.createChangelogEntry(process)
case err@JsError(_) => BadRequest("TEST")
case _ => BadRequest("fail to create Counter")
}).getOrElse(BadRequest("Failure tu create Counter"))
Ok("s")
}
}
一个问题是您没有等待控制器完成插入:
// Problem
case JsSuccess(process, _) => changelogDTO.createChangelogEntry(process)
您应该映射未来并 return 像这样异步地获取其结果:
// Do this
case JsSuccess(process, _) => changelogDTO.createChangelogEntry(process).map(model => Ok(Json.toJson(model))
然而,这将意味着您也需要所有其他情况 return 期货,并且您必须将结果操作更改为 by async。我会这样做:
def createChangelogEntry = Action.async(parse.json) { implicit request =>
request.body.validate[ChangelogModel].fold(
errors => Future(BadRequest(JsError.toJson(errors))),
changelogModel => changelogDTO.createChangelogEntry(changelogModel).map(model => Ok(Json.toJson(model))
)
}
与此同时,您可能会发现将当前的插入内容包装在 Await.result
中更容易调试,如下所示:
import scala.concurrent.duration._
case JsSuccess(process, _) =>
val model = Await.result(changelogDTO.createChangelogEntry(process), 5 seconds)
Ok("We inserted the thing")