这是我参与「第三届青训营 -后端场」笔记创作活动的第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