19 Go的全能ORM简单入门

Posted 温柔易淡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了19 Go的全能ORM简单入门相关的知识,希望对你有一定的参考价值。

gorm

昨天我的ldap账户改了以后,openfalcon(v2.1)-dashboard竟然无法登陆了!显然,没有把我的密码同步到本地数据库里面,怎么办?只能改openfalcon用户认证的源码了,把ldap密码同步到数据库里面,在这里改动的当中,发现openfalcon使用的gorm来操作数据库,那么我就简单的了解下gorm作为低级入门了。

话不多说,我们先看下openfalcon用户登录这块的源码:

1. 导入包与定义结构体
import (
    "github.com/jinzhu/gorm"
)

type DBPool struct {
    Falcon    *gorm.DB
    Graph     *gorm.DB
    Uic       *gorm.DB
    Dashboard *gorm.DB
    Alarm     *gorm.DB
}
2. 定义变量
var db config.DBPool
3. http请求处理与使用orm操作数据库
    password := utils.HashIt(inputs.Passwd)

    var user uic.User
    user = uic.User{
        Name:   inputs.Name,
        Passwd: password,
        Cnname: inputs.Cnname,
        Email:  inputs.Email,
        Phone:  inputs.Phone,
        IM:     inputs.IM,
        QQ:     inputs.QQ,
    }
    db.Uic.Table("user").Where("name = ?", inputs.Name).Scan(&user)
    
    // 以下代码 针对刚才说的bug,我自己改过了的,
    if user.ID != 0 { //  update the user‘s person info
        //h.JSONR(c, http.StatusBadRequest, "name is already existing")
        dt := db.Uic.Table("user").Where("name = ?", inputs.Name).Update("passwd", password)
        if dt.Error != nil {
            h.JSONR(c, http.StatusBadRequest, dt.Error)
            return
        }
    } else { //
        //for create a root user during the first time
        if inputs.Name == "root" {
            user.Role = 2
        }

        dt := db.Uic.Table("user").Create(&user)
        if dt.Error != nil {
            h.JSONR(c, http.StatusBadRequest, dt.Error)
            return
        }
    }

上面的流程说明了,下面就结合openfalcon的源码看看gorm的使用吧

gorm的简单使用

查询用户信息

先提前定义好用户信息的结构体,基本与mysql表字段一致

db.Uic.Table("user").Where("name = ?", inputs.Name).Scan(&user)

数据更新

  1. 更新一个字段用Update
  2. 更新多个字段用Updates
更新一个字段

更新一个字段可以直接写Update(字段名,新值)

dt := db.Uic.Table("user").Where("name = ?" , inputs.Name).Update("passwd", password)
if dt.Error != nil {
    return
}
更新多个字段

1.使用map
更新多个字段,那么就要写成map形式了作为Updates的参数

dt := db.Uic.Table("user")..Where("name = ?" , inputs.Name).Updates(map[string]interface{}{"name": "hello", "im": xxx, "Phone": 182****0534})

2.使用struct来更新多个字段,使用struct更新多个属性,只会更新这些更改的和非空白字段,也就是说当使用struct更新时,FORM将仅更新具有非空值的字段

dt := db.Uic.Table("user")..Where("name = ?" , inputs.Name).Updates(User{Name: "hello", cnname: xxx})
更新全部字段

使用Save方法来更新所有字段,传入一个结构体的内存地址,凡是这个结构体的字段,都给更新了。

dt.Save(&user)

好了,到此为止,现学现用,如果还想学期其他功能的同学,可以查看 GORM 中文文档教程

以上是关于19 Go的全能ORM简单入门的主要内容,如果未能解决你的问题,请参考以下文章

Cg入门19:Fragment shader - 片段级模型动态变色

人工智能 Open AI 我们程序员真的要下岗了- 全能写Go / C / Java / C++ / Python / JS 人工智能机器人

从java到Go搭建Go的ORM框架Gorm

从java到Go搭建Go的ORM框架Gorm

从java到Go搭建Go的ORM框架Gorm

从java到Go搭建Go的ORM框架Gorm