GORM 入门指南


第一章:GORM 入门指南

1.1 GORM 简介

GORM 是 Go 语言中最流行的 ORM 库之一,全称为 Go Object Relational Mapping。它由 Jinzhu 开发并维护,提供了简洁优雅的 API 来操作数据库。

GORM 的核心特性

特性 说明
全功能 ORM 支持关联(一对一、一对多、多对多)、钩子、预加载、连接池等
链式操作 流畅的查询构建器 API
自动迁移 根据模型自动创建/更新数据库表结构
通用数据库支持 MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等
可扩展性 基于 GORM 编写插件,如 Prometheus 监控、锁机制等
上下文支持 完整支持 context.Context

GORM 版本

  • GORM v1: 第一个稳定版本,已停止维护
  • GORM v2: 当前主流版本,完全重写,性能更好(推荐)

1.2 环境准备

安装 Go

确保 Go 版本 >= 1.16:

go version

安装 GORM

go get -u gorm.io/gorm

安装数据库驱动

根据你使用的数据库选择对应的驱动:

# MySQL
go get -u gorm.io/driver/mysql

# PostgreSQL
go get -u gorm.io/driver/postgres

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

# SQL Server
go get -u gorm.io/driver/sqlserver

1.3 第一个 GORM 程序

项目结构

hello-gorm/
├── go.mod
├── main.go
└── models/
    └── user.go

初始化项目

mkdir hello-gorm
cd hello-gorm
go mod init hello-gorm

定义模型

package models

import "gorm.io/gorm"

type User struct {
    gorm.Model        // 内嵌基础字段:ID, CreatedAt, UpdatedAt, DeletedAt
    Name     string   // 默认字段类型 varchar(191)
    Email    string   `gorm:"uniqueIndex"`  // 唯一索引
    Age      int      
}

完整示例代码

package main

import (
    "log"
    
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)

type User struct {
    gorm.Model
    Name  string
    Email string `gorm:"uniqueIndex"`
    Age   int
}

func main() {
    // 1. 连接数据库(使用 SQLite 内存模式)
    db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{
        Logger: logger.Default.LogMode(logger.Info), // 打印 SQL 日志
    })
    if err != nil {
        log.Fatal("数据库连接失败:", err)
    }

    // 2. 自动迁移表结构
    db.AutoMigrate(&User{})

    // 3. 创建记录
    user := User{Name: "张三", Email: "zhangsan@example.com", Age: 25}
    result := db.Create(&user)
    if result.Error != nil {
        log.Fatal("创建失败:", result.Error)
    }
    log.Printf("插入记录数: %d, 新记录 ID: %d", result.RowsAffected, user.ID)

    // 4. 查询记录
    var found User
    db.First(&found, user.ID)
    log.Printf("查询结果: %+v", found)

    // 5. 更新记录
    db.Model(&found).Update("Age", 26)

    // 6. 删除记录
    db.Delete(&found)

    log.Println("操作完成!")
}

运行程序

go run main.go

预期输出:

2024/xx/xx xx:xx:xx main.go:xx
[0.0ms] [rows:1] INSERT INTO `users` ...
2024/xx/xx xx:xx:xx main.go:xx
[0.0ms] [rows:1] SELECT * FROM `users` ...
2024/xx/xx xx:xx:xx main.go:xx
[0.0ms] [rows:1] UPDATE `users` SET ...
2024/xx/xx xx:xx:xx main.go:xx
[0.0ms] [rows:1] UPDATE `users` SET `deleted_at`=...
插入记录数: 1, 新记录 ID: 1
查询结果: {Model:{ID:1 ...} Name:张三 Email:zhangsan@example.com Age:25}
操作完成!

1.4 核心概念速览

模型(Model)

GORM 使用 Go 结构体定义数据库表结构。每个结构体对应一张表,每个字段对应一列。

type Product struct {
    Code  string
    Price uint
}

约定优于配置

约定 说明
表名 结构体名的复数形式(Userusers
主键 名为 ID 的字段
列名 字段名的蛇形小写(UserNameuser_name
创建时间 CreatedAt 字段
更新时间 UpdatedAt 字段
删除时间 DeletedAt 字段(软删除)

数据库操作链

db              // *gorm.DB 实例
  .Model(&User{})   // 指定模型
  .Where(...)       // 添加条件
  .Find(&users)     // 执行查询

1.5 练习题

  1. 修改示例,使用 MySQL 连接本地数据库
  2. 给 User 模型添加 Phone 字段(手机号,唯一索引)
  3. 尝试批量创建 3 个用户记录

1.6 小结

本章介绍了 GORM 的基本概念,并完成了第一个完整的 CRUD 程序。接下来我们将深入探讨模型定义的更多细节。


本文代码地址:https://github.com/LittleMoreInteresting/gorm_study

欢迎关注公众号,一起学习进步!

如有疑问关注公众号给我留言
wx

关注公众号

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo