【问题标题】:Golong (gorm) - how to create new record with jsonGolong (gorm) - 如何使用 json 创建新记录
【发布时间】:2021-09-14 07:51:27
【问题描述】:

我正在尝试使用 golang、gin、gorm 创建简单的后端 RestAPI。我有点迷失在这里。 我想使用以下有效负载在 DB 上创建新记录 请参考以下代码

这是我从前端获取的示例负载 - React

{
    "logged_user": {
        "user_id": "2350e6aa-ee3d-11eb-8d84-1e00d1365135",
        "full_name": "demo1",
        "email": "sample@gmail.com",
        "role": "admin"
    },
    "employee_detail": [
        {
            "from_address": "chennai-102",
            "to_address": "chennai-17",
            "emp_id": "071bdd76-0b36-11ed-9a05-0242ac130003",
            "emp_date": "07/29/2021",
            "reason": "dinner",
            "comments": "this is comments field ponnamalle"
        },
 {
            "from_address": "chennai-102",
            "to_address": "chennai-17",
            "emp_id": "071bdd76-0b36-11ed-9a05-0242ac13000",
            "emp_date": "07/29/2021",
            "reason": "dinner",
            "comments": "this is comments field"
        },
        ]
    
}

这是 emp 模型,我创建了用于生成 UUID 的基本类型 模型.go

type Base struct {
    gorm.Model
    ID string `gorm:"primary_key;not_null" json:"id"`
}

type Emp struct {
    Base
    LoggedUser LoggedUser `gorm:"embedded" json:"logged_user"`
    EmpDetail []struct {
        EmpId      string  `gorm:"not_null;" json:"Emp_id"`
        Date    string  `gorm:"size:255;not_null;" json:"date"`
        FromAddress string  `gorm:"size:255;not_null;" json:"from_address"`
        ToAddress   string  `gorm:"size:255;not_null;" json:"to_address"`
        Reason      string  `gorm:"size:255;not_null;" json:"reason"`
        Comments    string  `gorm:"size:255;not_null;" json:"comments"`
    } `gorm:"foreignKey:TripId;" json:"emp_detail"`
}

CreateEmp for Unmarshall the bdoy 并准备 bodyto saveEmp

controller.go

func (server *Server) CreateEmp(context *gin.Context) {
    errMessage := map[string]string{}
    body, err := ioutil.ReadAll(context.Request.Body)
    var emp models.Emp

    if err != nil {
        errMessage["Invalid Request"] = "Invalid Request"
        context.JSON(http.StatusUnprocessableEntity, gin.H{
            "status": http.StatusUnprocessableEntity,
            "error":  errMessage,
        })
        return
    }

    err = json.Unmarshal([]byte(body), &emp)
    if err != nil {
        errMessage["Unable to Unmarshall"] = "Unable to unmarshal"
        context.JSON(http.StatusUnprocessableEntity, gin.H{
            "status": http.StatusUnprocessableEntity,
            "error":  errMessage,
        })
        return
    }

    createdEmp, err := emp.SaveEmp(server.DB)

    if err != nil {
        context.JSON(http.StatusInternalServerError, gin.H{
            "status": http.StatusInternalServerError,
            "error":  err.Error(),
        })
        return
    }

    context.JSON(http.StatusOK, gin.H{
        "status":   http.StatusOK,
        "response": createdEmp,
    })

}

最后将创建记录的方法保存到数据库。 saveEmp 方法

func (emp *Emp) SaveEmp(db *gorm.DB) (*Emp, error) {
    if err := db.Debug().Create(&emp).Error; err != nil {
       return &Emp{}, err
}
return emp, nil
}

当我尝试创建新记录时,使用上面的代码。它仅使用 loggedUser 字段创建空记录。请参考下图

提前致谢。

【问题讨论】:

  • 您是否尝试将登录的用户信息嵌入到员工表列中?因为embedded 标签就是它的作用。通过您的屏幕截图,我看到您有一个用于登录用户详细信息的不同表格。
  • 感谢@SpirosI.Economakis。是的,我想将登录的用户信息存储在员工表中。而上面的截图其实是员工表。
  • 现在我有点困惑。如果这是员工表,from_address to_address 等字段在哪里,而您错过了将保存嵌入数据的 logged_user 字段。

标签: go go-gorm


【解决方案1】:

一目了然,我建议您将业务逻辑与数据库逻辑分开。试着在 2 周内阅读这段代码,你会发疯的。看看repository pattern

如果我是你,我会创建一个单例来处理与 DB 的连接并使用 gorm Migrartion 来更新你的架构 DB。

然后,将 EmpDetails 设为一个类型,迁移两个实体

结果是这样的

type Emp struct{
gorm.Model
//other fields
EmpDet []*EmpDetails `gorm:"foreignKey:emp_id;constraint:OnUpdate:CASCADE,OnDelete:CASCADE" json:"details"`
}

type EmpDetails{
    gorm.Model
    //other fields
    EmpID *uint `json:"EmpId" gorm:"column:emp_id"`
    Emp *Emp `gorm:"foreignKey:emp_id;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`
}

小心gorm 标签,特别是foreignKey 命名。看看gorm has many association 另外,我注意到某些标签在没有指向该字段的指针的情况下无法工作

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2012-04-30
    • 2020-01-05
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多