当前位置: 首页 > 知识库问答 >
问题:

玩!框架/Anorm:将数据转换为JSON并存储到DB

杨柏
2023-03-14

第一次使用play框架,我正在努力将我转换为JSON的数据保存到我在框架中建立的数据库中。

以下是我正在尝试的:

控制器

//Write converter to convert our model data to JSON
implicit val taskWrites: Writes[Task] = (
    (JsPath \ "id").write[Int] and
    (JsPath \ "name").write[String] and
    (JsPath \ "description").write[String] and
    (JsPath \ "group").write[String]
    )(unlift(Task.unapply))



//saving tasks in JSON format. Returning OK if success.
def saveTask = Action(BodyParsers.parse.json) { request =>
    val taskResult = request.body.validate[Task]
    taskResult.fold(
        errors => {
            BadRequest(Json.obj("status" -> "KO", "Message" -> JsError.toJson(errors)))
        },
        task => {
            Task.save(task)
            //ERROR HERE: Task.insertIntoDB(task)
            Ok(Json.obj("status" -> "Ok", "Message" -> ("Task '" +task.name+ "' saved")))
        }
    )
}

模型

case class Task(id: Int, name: String, description: String, group: String)

var list: List[Task] = Nil

//define a parser that will transform a JDBC ResultSet into a Task value.
val task = {
    get[Int]("id") ~
    get[String]("name") ~
    get[String]("description") ~
    get[String]("group") map {
        case id~name~description~group => Task(id, name, description, group)
    }

}

def save(task: Task) = {
    list = list ::: List(task)
}

def insertIntoDB(task: Task){
    DB.withConnection { implicit c =>
        SQL("insert into task (id, name, description, groupname) values ({task.id, task.name, task.description, task.group})").on(
            'id -> task.id,
            'name -> task.name,
            'description -> task.description,
            'groupname -> task.group
            ).executeUpdate()
    }
}

我正在使用H2数据库引擎

evolutions/default/1。sql

#Tasks Schema

# ---- !Ups
CREATE SEQUENCE task_id_seq;
CREATE TABLE task (
    id integer NOT NULL DEFAULT nextval('task_id_seq'),
    name varchar(255),
    description varchar(255),
    groupname varchar(255)
);

# ---- !Downs
DROP SEQUENCE task_id_seq;
DROP TABLE task;

但当我尝试添加新任务时:

curl--include--request POST--header“content type:application/json”--数据“{”id“:4,“name”:“test5”,“description”:“testdesc1”,“group”:“groupc”}”http://localhost:9000/tasks

我收到错误信息:

[JdbcSQLException:SQL语句“插入到任务(ID、名称、描述、组名)值([*]”)中的语法错误,默认值,不存在,相交;SQL语句:插入到任务(ID、名称、描述、组名)值([42001-191]]

我这样做对吗?忽略错误,我不这么认为。我如何结合保存插入IntoDB

另外,如何在不必每次都卷曲的情况下测试添加数据?

谢谢你的帮助!

编辑:添加模式新错误

共有1个答案

陶高峯
2023-03-14

问题是在执行插入操作时使用了错误的名称/键:

def insertIntoDB(task: Task) {
  DB.withConnection { implicit c =>
    SQL("insert into task (id, name, description, groupname) values ({task.id, task.name, task.description, task.group})").on(
      'id -> task.id,
      'name -> task.name,
      'description -> task.description,
      'groupname -> task.group
    ).executeUpdate()
  }
}

问题是:

  1. 插入模板错误。假设对每个变量使用{}

您可以重写为:

def insertIntoDB(task: Task) {
  DB.withConnection { implicit c =>
    SQL("insert into task (id, name, description, groupname) values ({id}, {name}, {description}, {groupname})").on(
      'id -> task.id,
      'name -> task.name,
      'description -> task.description,
      'groupname -> task.group
    ).executeUpdate()
  }
}

甚至可以缩写为:

def insertIntoDB(task: Task) {
  DB.withConnection { implicit c =>
    SQL("insert into task (id, name, description, groupname) values (${task.id}, ${task.name}, ${task.description}, ${task.group})").executeUpdate()
  }
}

我强烈建议您在这里阅读Anorm文档:

https://www.playframework.com/documentation/2.5.x/ScalaAnorm

 类似资料:
  • 我一直在android studio上开发一个Java应用程序,我想提取我存储在google数据存储中的几个实体。实体存储为列表 我只需要每个属性的“值”。 有没有办法将响应转换回带有json的数据存储实体? 编辑:我的代码片段

  • 问题内容: 我有一个带有属性的文本,并设置为。 我正在尝试使用以下代码将属性字符串转换为Data对象: 但是,这将引发以下错误: 任何想法这个错误是什么意思或可能导致此错误?我正在使用最新的Xcode和iOS。谢谢。 问题答案: 您需要指定要将属性字符串转换为以下类型的文档数据: 更新Xcode 10.2•Swift 5或更高版本 对此进行扩展: 用法: 这将打印

  • 问题内容: 我正在从一列存储为JSON的数据库(超过5万行)中读取数据。我想将其提取到pandas数据框中。下面的代码片段可以正常工作,但是效率很低,并且在对整个数据库运行时会花费很多时间。请注意,并非所有项目都具有相同的属性,并且JSON具有一些嵌套的属性。 我怎样才能使它更快? 问题答案: json_normalize接受一个已经处理过的json字符串或一系列这样的字符串。 设定

  • 问题内容: 我正在尝试将HTML表中存在的数据转换为JSON,以便可以在服务器端进行相应的处理。我可以序列化数据,但是结果充其量只能生成不直接链接的独特数据数组。像:这是我正在使用的形式: 序列化数据的脚本是: 经过数页StackOverFlow之后,我得到了serializeFormJSON(): 通过使用所有这些,我可以得到像这样的JSON: 我尝试了多种方法以名称-性别格式获取它们,但是每种

  • 问题内容: 我如何将JSON文件这样转换为数据框以进行一些转换。 例如,如果JSON文件读取: 我如何将其转换为这样的表 问题答案: 从字典对象创建数据框。 如果您有嵌套的列,那么您首先需要规范化数据: 来源:https : //github.com/vi3k6i5/pandas_basics/blob/master/1_a_create_a_dataframe_from_dictonary.ip

  • 问题内容: 是否有任何jQuery或javascript库根据给定的json数据生成动态表?我不想定义列,该库应该读取json哈希中的键并生成列。 当然,我可以自己遍历json数据并生成html表。我只想知道是否存在可以简单重用的此类库。 问题答案: 感谢大家的答复,这使用jQuery。 程式码片段: