这是我参与「第五届青训营 」笔记创作活动的第6天
Gorm是golang的一个ORM框架。 安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
模型定义
模型是数据库每个表对应的一个struct,struct每个字段对应了表中的每一列,结构体的蛇形复数作为表名,字段名的蛇形作为列名
连接数据库
通过open方法,可以获取一个数据库连接db
dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
增
创建一条记录,当插入的数据某些字段声明了零值,0,'',false是不会保存进据库中的,默认值会进行填充,需要使用指针类型来声明字段。
- 可以直接通过结构体创建
user := User{Name: "zhangsan", Phone: "XXXXXXXX"}
result := db.Create(&user)
user.ID // 返回数据库生成的主键
result.Error // 返回 error
result.RowsAffected // 返回插入记录的条数
- 指定字段创建
user := User{}
db.Select("Name", "Phone").Create(&user)
- 批量插入
var users = []User{{Name: "user1"}, {Name: "user2"}, {Name: "user3"}}
db.Create(&users)
也可以指定每一批的插入数目
db.CreateInBatches(users, 10)
-使用map创建
db.Model(&User{}).Create(map[string]interface{}{{"Name":"user1","Phone":"xxxxx"},{"Name":"user2","Phone":"xxxxx"}})
删
- 根据主键删除:```db.Delete(&User{}, 1)
db.Delete(&users, []int{1,2,3})
批量删除db.Where("phone LIKE ?", "%135%").Delete(&User{})
改
-更新单列
-条件更新db.Model(&User{}).Where("name = ?", "zhangsan").Update("phone", "XXXXXX")
-Struct更新db.Model(&user).Updates(User{Name: "张三", Phone:"XXXX"})
-Map更新db.Model(&user).Updates(map[string]interface{}{"name": "张三", "phone":"xxxxxx"})
-选定字段更新,仅更新 name字段db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "phone":"xxxxx"})
-忽略某些字段db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello", "phone":"xxxxx"})
查
-查询单个对象:
db.First(&user)
获取第一条记录(主键排序),获取不到数据时,会返回ErrRecordNotFound错误。db.Take(&user)
获取一条记录(无排序)db.Last(&user)
获取最后一条记录(主键排序)
-查询多个对象:
result := db.Find(&users)
result.RowsAffected
获取返回的行数result.Error
获取返回的错误
-条件查询 :.Where(),where的条件主要有以下三种结构。
db.Where("name = ?", "zhangsan").First(&user)
条件db.Where(&User{Name: "zhangsan", Phone:"xxxxx"}).First(&user)
结构体db.Where(map[string]interface{}{"name": "jinzhu"}).Find(&users)
Map形式