GORM常用操作总结 | 豆包MarsCode AI刷题

126 阅读3分钟

1. GORM的安装

GORM 是Go语言的一个第三方库,用来操作数据库完成一系列操作,GORM的安装操作如下:

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

如果出现超时等一系列网络问题,可以使用如下命令进行安装(Windows系统):

$env:GO111MODULE = "on"
$env:GOPROXY = "https://goproxy.cn"

其他操作系统可以访问这里 ,里面有详细教程。

安装成功后的界面如下所示:

image.png

接下来写一个简单的go程序来看GORM是否可以使用。

package main
​
import (
    "fmt"
    "gorm.io/gorm"
    "gorm.io/driver/mysql"
    "log"
)
​
func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatalf("Failed to connect to database: %v", err)
    }
​
    fmt.Println(db)
​
    log.Println("Database connected successfully!")
}

其中,dsn里面的三个参数名分别对应如下内容:

  • user:mysql用户名;
  • password:mysql密码;
  • dbname:创建的数据库名称。

如果你的"gorm.io/gorm"这几行代码爆红,那么可以执行如下命令使其恢复正常(前提你使用的是GoLand):

go mod vendor

代码运行后的结果如下:

image.png

2.GORM的基本操作

2.1 创建

在数据库中创建一条记录的代码如下:

package main
​
import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "log"
)
​
// Table
type User struct {
    ID   uint
    Name string
    Age  uint8
}
​
func main() {
    dsn := "root:123456@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatalf("Failed to connect to database: %v", err)
    }
​
    // 自动迁移
    err = db.AutoMigrate(&User{})
    if err != nil {
        panic("failed to migrate")
    }
​
    // 通过结构体指针添加
    user := User{Name: "Alice", Age: 22}
    result := db.Create(&user)
​
    fmt.Println(user.ID)
    fmt.Println(result.Error)
    fmt.Println(result.RowsAffected)
}

也可以使用Create函数创建多条记录:

package main
​
import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "log"
)
​
type User struct {
    ID   uint
    Name string
    Age  uint8
}
​
func main() {
    dsn := "root:123456@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatalf("Failed to connect to database: %v", err)
    }
​
    err = db.AutoMigrate(&User{})
    if err != nil {
        panic("failed to migrate")
    }
​
    users := []User{
        {Name: "Alice", Age: 19},
        {Name: "Bob", Age: 22},
    }
​
    result := db.Create(users)
    
    fmt.Println(result.Error)
    fmt.Println(result.RowsAffected)
}

2.2 删除

删除记录时,需要确保主键字段有值,GORM 会通过主键去删除记录,如果主键为空,GORM 会删除该 model 的所有记录。

  • 物理删除
db.Delete(&User{}, 10)
db.Delete(&User{}, []int{1, 2, 3})

2.3 更新数据

// 条件更新单个列
db.Model(&User{ID: 111}).Where("age > ?", 18).Update("name", "Bob")

// 更新多个列
db.Model(&User{ID: 111}).Updates(User{Name: "Bob", Age: 18})

2.4 查询数据

GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误。

// 获取第一条记录
u := &User{}
db.First(u)
​
// 查询多条数据
users := make([]*User, 0)
result := db.Where("age > 10").Find(&users)

3. GORM总结

  • 易用性

    • 提供了直观的 API,开发者可以通过链式调用轻松进行数据库操作,无需手写复杂的 SQL 查询。
    • 支持 Golang 的结构体与数据库表的映射,减少了手动配置的麻烦。
  • 功能丰富

    • 自动迁移(AutoMigrate): 能自动创建或更新数据库表结构。
    • 关系支持: 支持一对一、一对多、多对多关系及关联操作。
    • 查询构造: 提供丰富的查询选项(条件查询、分组、排序等)。
    • 钩子(Hooks): 提供生命周期回调(如 BeforeSaveAfterCreate)以扩展功能。
    • 事务支持: 提供便捷的事务管理。
  • 高度可扩展

    • 支持自定义模型、字段类型和方法。
    • 可以轻松与其他第三方库集成,例如日志记录、数据验证等。
  • 兼容性强

    • 支持多种数据库(MySQL、PostgreSQL、SQLite、SQL Server 等)。
    • 提供通用的接口,便于切换数据库驱动或在不同数据库之间迁移。
  • 高性能

    • 内部经过优化,减少了不必要的查询和操作,适合大多数应用场景。
    • 支持连接池配置,提升高并发场景下的性能。

总之,GORM 是一个功能强大、易用且灵活的 ORM 框架,帮助开发人员提高了开发效率,减少了不必要的开发时间。