使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作,把实现过程整理成文章 | 青训营

72 阅读3分钟

使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作,把实现过程整理成文章

GORM 简介

太高端的咱用不着,所以我就简单介绍一下gorm用得到的性质 对象操作:我们一般对数据库进行操作需要写详细的sql语句,并且对于一整个结构体的增删改查不够方便。在GORM里面,我们可以直接传入一整个结构体对象进行操作,编译器会帮我们自动绑定到表单和字段,使我们更加专注处理对象之间的逻辑,而不必太过思考对象内部的逻辑。

GORM 模型定义

模型定义:在go里面,如果我们定义的结构体比较的规范优美的话,可以使得其自动匹配上数据库里面的字段名。如何才叫做优美呢?UserName这个作为Go结构体的成员变量类型就比较优美,这种叫做驼峰,就是单词的开头用大写其他用小写。这样,我们会自动匹配上蛇形的字段名user_name,将单词用一个_分开,其余都是小写。而对于结构体的表名,User -> users这样来做对应。 小特性:

  • 创建/更新时间跟踪:如果有CreateAtUpdateAt这样的成员变量的话,gorm会自动分别在创建和更新的时候将其字段更新为当前时间。
  • 标签声明:在go结构体定义时,在变量后面可以加上标签tag用于gorm使用时的特殊解释。 常用的会有:
    • column:用于指定数据表的字段名
    • - :用于忽略该字段
    • primaryKey:用于将列定义为主键

正式连接到数据库(以mysql为例)

需要用驱动连接

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

增删改查

  • 创建记录:

    • 插入单条记录
      user := User{Name: "hia", Age: 21}
      result := db.Create(&user)
      
    • 插入记录但只给指定字段分配值
      db.Select("Name", "Age").Create(&user)
      
  • 查询记录:

    • 查询单个记录 返回第一条记录(主键升序) db.First(&user) 返回一条记录,没有指定排序字段 db.Take(&user) 返回最后一条记录 db.Last(&user)
    • 查询所有记录 result := db.Find(&users) 可以用以下的条件来查询特定内容:
    // Get first matched record
    db.Where("name = ?", "jinzhu").First(&user)
    // SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;
    
    // Get all matched records
    db.Where("name <> ?", "jinzhu").Find(&users)
    // SELECT * FROM users WHERE name <> 'jinzhu';
    
    // IN
    db.Where("name IN ?", []string{"jinzhu", "jinzhu 2"}).Find(&users)
    // SELECT * FROM users WHERE name IN ('jinzhu','jinzhu 2');
    
    // LIKE
    db.Where("name LIKE ?", "%jin%").Find(&users)
    // SELECT * FROM users WHERE name LIKE '%jin%';
    
    // AND
    db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
    // SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;
    
    // Time
    db.Where("updated_at > ?", lastWeek).Find(&users)
    // SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';
    
    // BETWEEN
    db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
    // SELECT * FROM users WHERE created_at BETWEEN '2000-01-01 00:00:00
    
  • 更新记录 关键是需要先选中记录,然后直接updates方法更新即可

      result := db.Model(&user).Where("id = ?", 1).Updates(User{Name: "New Name", Age: 30})
    
  • 删除记录 删除和更新很像,就是找到记录,然后做操作就可以了

    • 删除指定记录 db.Delete(&user)
    • 删除满足条件的记录 db.where("name = ?", "hia").Delete(&user)