Gorm|青训营笔记

46 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第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形式