GORM框架入门 | 豆包MarsCode AI刷题

33 阅读4分钟

记录一下在课程中学习到的GORM框架及其应用,希望给大家带来一些帮助


一、GORM

GORM 是一个 Golang 的 ORM(Object Relational Mapping)库,它提供了简单而强大的 API,用于在 Go 应用程序中与数据库进行交互。通过 GORM,我们可以轻松地操作数据库中的数据,无需编写复杂的 SQL 语句。GORM 支持 MySQL、PostgreSQL、SQLite、SQL Server 等主流数据库。

GORM 提供了一些常用的功能,包括:

  • 数据库模型的映射和迁移
  • CRUD(创建、读取、更新、删除)操作
  • 查询构造、条件查询、事务支持
  • 关联关系(例如一对一、一对多、多对多等)
  • 钩子(Hooks)、回调和自定义 SQL

二、GORM 的基础使用

1. 初始化数据库连接

在安装gorm后,便可初始化数据库连接,其中DSN(Data Source Name)是一个用于配置数据库连接的字符串,它包含了连接数据库所需的所有信息,如数据库类型、地址、端口、数据库名、用户名、密码以及连接选项等。

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

func main() {
	dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"  // DSN字符串
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("failed to connect database: %v", err)
	}

}

2. gorm.Open()

是 GORM ORM 框架中用于创建和初始化数据库连接的函数。这个函数是使用 GORM 时与数据库交互的起点

func Open(dialector Dialector, config *Config) (*DB, error)
参数说明
  • dialector Dialector: 这个参数是一个实现了 Dialector 接口的实例,它用于配置数据库连接的详细信息,比如数据库类型、DSN(Data Source Name)等。GORM 为不同的数据库提供了不同的 Dialector 实现,例如 mysql.Open(), postgres.Open(), sqlite.Open() 等。
  • config *Config: 这个参数是一个指向 Config 结构体的指针,它允许你自定义 GORM 的行为,包括但不限于日志配置、命名策略、钩子函数等。
返回值
  • *DB: 如果数据库连接成功,gorm.Open() 函数会返回一个 *gorm.DB 实例,这是 GORM 中用于执行数据库操作的主要类型。
  • error: 如果在尝试打开数据库连接时发生错误,函数会返回一个错误。

3. DB.AutoMigrate()

是 GORM 框架中的一个功能,用于自动迁移数据库模式。这意味着它会根据你定义的 Go 结构体(structs)自动创建或修改数据库表结构。

AutoMigrate 有以下特点:

  • 自动创建表:如果表不存在,AutoMigrate 会根据结构体创建表。
  • 自动更新表:如果表已存在,AutoMigrate 会根据结构体的变化更新表结构,比如添加或删除列。
  • 模型关联AutoMigrate 也会处理模型之间的关联,比如一对一、一对多或多对多关系。
  • 可选参数AutoMigrate 允许传递一些参数来定制迁移过程,例如指定只创建表或只更新表。
func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    // 自动迁移模式
    db.AutoMigrate(&mystruct{})
}

注意!!! 对于已经存在的表和数据,使用Automigrate时它会根据结构体的变化尝试自动更新数据库表,但是它只会添加新字段、修改字段类型(如果不影响现有数据)不会删除字段或者做复杂的结构调整。这样避免了数据丢失的风险。

4. 定义模型

在 GORM 中,我们需要为数据库表创建对应的结构体。GORM 会将结构体的字段映射为数据库表的列。以下是一个简单的模型定义:

type User struct {
	ID       uint   `gorm:"primaryKey"`
	Name     string `gorm:"size:255;not null"`
	Email    string `gorm:"uniqueIndex;size:100"`
	Age      int
	Password string
}

在该模型中:

  • ID 是主键。
  • Name 字段是一个非空的字符串。
  • Email 字段是一个唯一索引,限制了最大长度为 100 个字符。
  • Age 是整数类型。
  • Password 是用户密码。

5. CRUD 操作

(1)创建记录

使用 Create 方法可以插入一条记录:

user := User{Name: "Alice", Email: "alice@example.com", Age: 25, Password: "password123"}
db.Create(&user)

(2)查询记录

使用 FirstFindWhere 等方法进行查询:

var user User
db.First(&user, 1) // 通过主键查询
db.Where("name = ?", "Alice").First(&user) // 条件查询

(3)更新记录

使用 SaveUpdateUpdates 等方法更新记录:

db.Model(&user).Update("Age", 26)
db.Model(&user).Updates(User{Name: "Alice Smith", Age: 27})

(4)删除记录

使用 Delete 方法删除记录:

db.Delete(&user, 1) // 通过主键删除

学习心得

目前感觉GORM框架和之前所用到的Django中的ORM框架非常类似,但GORM语法更加简洁,常见的 CRUD 操作、查询和关联关系管理都更加的直观,使用GORM框架可以大大提升开发效率。