GORM的学习 | 青训营笔记

108 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记

GORM的学习路径

英文版文档:gorm.io/docs/models…

中文版文档:learnku.com/docs/gorm/v…

GORM下载

go get -u gorm.io/gorm

使用方法

1、定义结构体

第一步,进行orm操作前必须有个结构体,用于承载或表示一条数据。通过一条数据也可以看到所在表的表结构,现在新建一张表。结构如下:

type UserInfo struct {
	Id     int `gorm:"primaryKey"`
	Name   string
	Gender string
	Hobby  string
}

2、连接mysql,通过GORM建立新表

dsn := "root:root123@(localhost:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    panic(err)
}
// 跑一下数据库迁移,如果不存在则新建表,存在判断字段是否一致不一致修改。
db.AutoMigrate(&ormdemo.UserInfo{})

dsn结构:"用户名:密码@(数据库连接:端口)/数据库名称?charset=字符集&parseTime=True&loc=Local"

3、新建一条数据

db.Create方法可以新建一条数据,传入的是一个表结构体指针,返回值是一个gorm.DB,即我们的数据库连接。如下:

type User struct {
	Id           int     `gorm:"column:id; type:int(11);primary_key"`
	Name         string  `gorm:"column:name; type:varchar(32);"`
	Age          int     `gorm:"column:age; type:int(11);"`
	Description  string  `gorm:"column:description; type:varchar(512);"`
}

func (User) TableName() string {
	return "test.user"
}

关于新建数据,最好使用Save方法,当匹配主键的数据不存在时,它的效果是插入一条新数据,而当匹配主键的数据存在时,则更新全部字段,无论字段是否做了修改或者是否是定义类型的默认值。

3、查询数据

var u = &ormdemo.UserInfo{}
db.First(u, 1).Update("hobby", "running")
fmt.Printf("姓名:%s,爱好:%s", u.Name, u.Hobby)
// 姓名:jaylog,爱好:running

或者

var u = &ormdemo.UserInfo{}
db.First(u, 1)
db.Model(u).Uodate("hobby", "running")
fmt.Printf("姓名:%s,爱好:%s", u.Name, u.Hobby)
// 姓名:jaylog,爱好:running

4、删除数据

db.Delete(&u, 1)
// 删除一条id为1的数据

5、更新数据

SaveOne方法是全量更新,但大部分情况是,可能只是更新某条数据的部分字段,又或者是只想更新改过的字段。

type UserDesc struct {
	Id           int     `gorm:"column:id; type:int(11);primary_key"`
	Description  string  `gorm:"column:description; type:varchar(512);"`
}

func (UserDesc) TableName() string {
	return "test.user"
}

userDesc := UserDesc{Id:1,  Description: "A programmer"}

if err := dw.SaveOne(&userDesc); err != nil{
    // error handling
    return err
}
\\执行的SQL语句是
update test.user set description = "A programmer" where id = 1