使用gorm(go的orm库)连接数据库 | 青训营

103 阅读3分钟

首先介绍一下gorm的特性:

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context,预编译模式,DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
  • 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

MyBatis和它比的不同之处: MyBatis并不是真正的ORM框架,只是一个半自动的SQL映射框架,提供的功能不如ORM框架强大,但是拥有更多的灵活性:

  1. MyBatis需要开发者自己编写SQL语句,因此可以充分自由地执行SQL优化;
  2. MyBatis需要开发者自己定义ResultSet与对象之间的映射关系,因此可以简单的避免循环使用的问题。

我们想要使用gorm库连接数据库并实现增删改查,首先需要安装gorm库,然后按照以下步骤进行操作:

现在我们先创建一个空文件夹(自定义英文名),作为工程根目录。 在根目录执行指令go mod init demo 接着在根目录创建一个config文件夹,再在内创建configs.go文件,写入以下内容:


func GetMySQLConfig() (addr, user, pwd, dbName string) {
	addr = "xxx.com:3306"
	user = "your_mysql__username"
	pwd = "your_mysql_password"
	dbName = "your_mysql_database_name"
	return addr, user, pwd, dbName
} 
  1. 我们需要安装gorm依赖和数据库依赖,由于我们使用的是MySQL而非sqlite,所以我们只执行第一条语句安装gorm依赖,而数据库依赖我们需要另找,导入gorm库和数据库驱动
import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)
  1. 定义数据库连接信息
dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  1. 创建数据库连接
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    panic("连接数据库失败")
}
  1. 增加数据(Create)
// 创建一个User对象
user := User{Name: "张三", Age: 18}
// 使用AutoMigrate自动创建表结构
err = db.AutoMigrate(&user)
if err != nil {
    panic("创建表失败")
}
// 保存user到数据库
result := db.Create(&user)
if result.Error != nil {
    panic("插入数据失败")
}
  1. 查询数据(Read)
var users []User
result := db.Find(&users) // 查询所有记录,按主键排序
if result.Error != nil {
    panic("查询数据失败")
} else {
    fmt.Println(users)
}
  1. 更新数据(Update)
// 根据ID查找用户
user := User{}
result = db.Where("id = ?", 1).First(&user) // 查询指定ID的记录,按主键排序,只返回一条记录
if result.Error != nil {
    panic("查询数据失败")
} else {
    user.Name = "李四" // 更新User的Name字段
    // 保存更新后的数据到数据库
    result = db.Save(&user) // 如果主键冲突,会更新记录;否则会插入新记录
    if result.Error != nil {
        panic("更新数据失败")
    } else {
        fmt.Println("更新成功")
    }
}
  1. 删除数据(Delete)
// 根据ID查找用户并删除记录
result = db.Where("id = ?", 1).Delete(&User{}) // 如果主键冲突,会删除记录;否则什么都不做(返回0表示未受影响的行数)
if result.Error != nil {
    panic("删除数据失败")
} else {
    fmt.Println("删除成功")
}