Gorm 框架使用 | 青训营笔记

44 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

连接数据库

dsn := "root:123456@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  • 创建表
db.AutoMigrate(&UserInfo{})
    u1 := UserInfo{1, "lishuo", "男", "篮球"}
    db.Create(&u1)
  • CRUD

        db.Create(&u1)
        var u UserInfo
        db.First(&u)   //查询表中第一条数据
        db.Model(&u).Update("name", "hhh")  //更新
        db.Delete(&u)  //删除
    

增删改查

  • 定义模型

    type User struct {
        ID   int64
        Name string
        Age  int64
    }
    
  • 把模型与数据库中的表对应起来

        db.AutoMigrate(&User{})
    
  • 创建

    u := User{ 5,"hh",20}
        db.Create(&u)
    
    • 使用默认值

      Name string `gorm:"default:'hhh'"`
      
    • 可使用字符串指针的方式将空字符串,加入到数据库中

      Name *string `gorm:"default:'hhh'"`
      u := user(new(string),20)
      
          Name sql.NullString `gorm:"default:'hhh'"`
          u := User{5, sql.NullString{String: "",Valid: true}, 20}
      
  • 查询

    // 获取第一条记录(主键升序)
    db.First(&user)
    // SELECT * FROM users ORDER BY id LIMIT 1;
    ​
    // 获取一条记录,没有指定排序字段
    db.Take(&user)
    // SELECT * FROM users LIMIT 1;
    ​
    // 获取最后一条记录(主键降序)
    db.Last(&user)
    // SELECT * FROM users ORDER BY id DESC LIMIT 1;
    ​
    result := db.First(&user)
    result.RowsAffected // 返回找到的记录数
    result.Error        // returns error or nil
    ​
    // 检查 ErrRecordNotFound 错误
    errors.Is(result.Error, gorm.ErrRecordNotFound)
    

检索全部对象

// Get all records
result := db.Find(&users)
// SELECT * FROM users;
​
result.RowsAffected // returns found records count, equals `len(users)`
result.Error        // returns error
  • 更新

    Save 会保存所有的字段,即使字段是零值

    db.First(&user)
    ​
    user.Name = "jinzhu 2"
    user.Age = 100
    db.Save(&user)
    

    update

    // 条件更新
    db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
    // UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;
    ​
    // User 的 ID 是 `111`
    db.Model(&user).Update("name", "hello")
    // UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;
    ​
    // 根据条件和 model 的值进行更新
    db.Model(&user).Where("active = ?", true).Update("name", "hello")
    // UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;
    
  • 删除

    1. 删除一条记录
    // Email 的 ID 是 `10`
    db.Delete(&email)
    // DELETE from emails where id = 10;
    ​
    // 带额外条件的删除
    db.Where("name = ?", "jinzhu").Delete(&email)
    // DELETE from emails where id = 10 AND name = "jinzhu";
    

    2.根据主键删除

    db.Delete(&User{}, 10)
    // DELETE FROM users WHERE id = 10;
    ​
    db.Delete(&User{}, "10")
    // DELETE FROM users WHERE id = 10;
    ​
    db.Delete(&users, []int{1,2,3})
    // DELETE FROM users WHERE id IN (1,2,3);
    

原生sql

type Result struct {
  ID   int
  Name string
  Age  int
}
​
var result Result
db.Raw("SELECT id, name, age FROM users WHERE name = ?", 3).Scan(&result)
​
db.Raw("SELECT id, name, age FROM users WHERE name = ?", 3).Scan(&result)
​
var age int
db.Raw("SELECT SUM(age) FROM users WHERE role = ?", "admin").Scan(&age)
​
var users []User
db.Raw("UPDATE users SET name = ? WHERE age = ? RETURNING id, name", "jinzhu", 20).Scan(&users)