每日一Go-18、Go语言实战-操作数据库:GORM入门

70 阅读5分钟

1、什么是GORM

GORM 是 Go 语言中最流行、功能最全的 ORM 框架之一。它可以:

  • 自动把 Go 结构体映射到数据库表
  • 自动生成 SQL(无需手写 SQL)
  • 提供友好的 CRUD API
  • 支持 MySQL / PostgreSQL / SQLite / SQL Server

下面我们通过一个简单示例,带你从零开始使用 GORM:连接数据库 → 定义模型 → 自动建表 → CRUD操作

2、GORM怎么用,以MySQL为例

2.1 安装GORM

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

2.2 连接数据库

package main
import (
    "log"
    "time"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)
func main() {
    // dsn:="用户名:密码@tcp(服务器地址:端口号)/数据库名?..."
    dsn := "root:123456@tcp(127.0.0.1:3306)/golang_per_day?charset=utf8&parseTime=True&loc=Local&timeout=1000ms"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("连接接数据库失败:", err)
    }
    log.Println("数据库连接成功:", db)
}

2.3 定义模型

// 默认表名是books(加s的小写复数)
type Book struct {
    gorm.Model // 自动创建gorm的默认字段
    Name       string
    Author     string
}
// 可通过 TableName() 自定义
// func (b Book) TableName() string{
//  return "book"
// }

2.4 自动建表

db.AutoMigrate(&Book{})

2.5 CRUD基础操作2.5.1 新增数据

db.Create(&Book{Name: "每日一GO", Author: "Coding君"})

2.5.2 查询数据


db.First(&book)
// 按条件查询一条
db.Where("author=?", "Coding君").First(&book)
// 查询多条
var books []Book
db.Find(&books)

2.5.3 更新数据

db.Model(&book).Update("author", "Codee君")

2.5.4 删除数据

db.Delete(&book)db.Delete(&Book{},1) //删除id=1的书籍

2.5.5 完整源码

package main
import (
    "log"
    "time"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)
//  gorm.Model源码
//  type Model struct {
//      ID        uint `gorm:"primarykey"`
//      CreatedAt time.Time
//      UpdatedAt time.Time
//      DeletedAt DeletedAt `gorm:"index"`
//  }
// 默认创建books表
type Book struct {
    gorm.Model // 自动创建gorm的默认字段
    Name       string
    Author     string
}
func main() {
    dsn := "root:123456@tcp(127.0.0.1:3306)/golang_per_day??charset=utf8&parseTime=True&loc=Local&timeout=1000ms"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("连接接数据库失败:", err)
    }
    log.Println("数据库连接成功:", db)
    sqlDb, err := db.DB()
    if err == nil {
        sqlDb.SetMaxIdleConns(10)
        sqlDb.SetMaxOpenConns(100)
        sqlDb.SetConnMaxLifetime(time.Hour)
    }
    // 开启debug模式
    db = db.Debug()
    // 自动建表
    db.AutoMigrate(&Book{})
    // 创建一条记录
    db.Create(&Book{Name: "每日一GO", Author: "Coding君"})
    var book Book
    // 查询一条记录
    db.First(&book)
    log.Println(book)
    // 按照条件查询一条记录
    db.Where("author=?", "Coding君").First(&book)
    log.Println(book)
    // 查询多条记录
    var books []Book
    db.Find(&books)
    log.Println(books)
    // 更新记录
    db.Model(&book).Update("author", "Codee君")
    // 删除记录
    db.Delete(&book)
}

3、调试信息

只有开启了调试(db = db.Debug())的才有sql调试信息

$ go run .
2025/11/14 22:49:41 数据库连接成功: &{0xc000000600 <nil> 0 0xc00008c380 1}          

2025/11/14 22:49:41 C:/Users/coding_jun/gorm_demo/main.go:44
[10.273ms] [rows:-] SELECT DATABASE()

2025/11/14 22:49:41 C:/Users/coding_jun/gorm_demo/main.go:44
[19.308ms] [rows:1] SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'golang_per_day%' ORDER BY SCHEMA_NAME='golang_per_day' DESC,SCHEMA_NAME limit 1                                                                             

2025/11/14 22:49:41 C:/Users/coding_jun/gorm_demo/main.go:44
[18.162ms] [rows:-] SELECT count(*) FROM information_schema.tables WHERE table_schema = 'golang_per_day' AND table_name = 'books' AND table_type = 'BASE TABLE'

2025/11/14 22:49:41 C:/Users/coding_jun/gorm_demo/main.go:44
[10.968ms] [rows:0] CREATE TABLE `books` (`id` bigint unsigned AUTO_INCREMENT,`created_at` datetime(3) NULL,`updated_at` datetime(3) NULL,`deleted_at` datetime(3) NULL,`name` longtext,`author` longtext,PRIMARY KEY (`id`),INDEX `idx_books_deleted_at` (`deleted_at`))

2025/11/14 22:49:41 C:/Users/coding_jun/gorm_demo/main.go:47
[45.358ms] [rows:1] INSERT INTO `books` (`created_at`,`updated_at`,`deleted_at`,`name`,`author`) VALUES ('2025-11-14 22:49:41.547','2025-11-14 22:49:41.547',NULL,'每日 一GO','Coding君')

2025/11/14 22:49:41 C:/Users/coding_jun/gorm_demo/main.go:52
[21.884ms] [rows:1] SELECT * FROM `books` WHERE `books`.`deleted_at` IS NULL ORDER BY `books`.`id` LIMIT 1
2025/11/14 22:49:41 {{1 2025-11-14 22:49:41.547 +0800 CST 2025-11-14 22:49:41.547 +0800 CST {0001-01-01 00:00:00 +0000 UTC false}} 每日一GO Coding君}

2025/11/14 22:49:41 C:/Users/coding_jun/gorm_demo/main.go:56
[16.803ms] [rows:1] SELECT * FROM `books` WHERE author='Coding君' AND `books`.`deleted_at` IS NULL AND `books`.`id` = 1 ORDER BY `books`.`id` LIMIT 1
2025/11/14 22:49:41 {{1 2025-11-14 22:49:41.547 +0800 CST 2025-11-14 22:49:41.547 +0800 CST {0001-01-01 00:00:00 +0000 UTC false}} 每日一GO Coding君}

2025/11/14 22:49:41 C:/Users/coding_jun/gorm_demo/main.go:61
[8.031ms] [rows:1] SELECT * FROM `books` WHERE `books`.`deleted_at` IS NULL
2025/11/14 22:49:41 [{{1 2025-11-14 22:49:41.547 +0800 CST 2025-11-14 22:49:41.547 +0800 CST {0001-01-01 00:00:00 +0000 UTC false}} 每日一GO Coding君}]

2025/11/14 22:49:41 C:/Users/coding_jun/gorm_demo/main.go:65
[32.509ms] [rows:1] UPDATE `books` SET `author`='Codee君',`updated_at`='2025-11-14 22:49:41.638' WHERE `books`.`deleted_at` IS NULL AND `id` = 1

2025/11/14 22:49:41 C:/Users/coding_jun/gorm_demo/main.go:68
[34.011ms] [rows:1] UPDATE `books` SET `deleted_at`='2025-11-14 22:49:41.671' WHERE `books`.`id` = 1 AND `books`.`deleted_at` IS NULL

GORM 就像身边一位可靠的老司机:

你只要讲目的地,他就帮你选路(映射模型、生成 SQL)

你只要提需求,他就帮你跑腿(CRUD)

你不用下车、不用搬货、不用管细节

他让你把精力集中在“你真正要做的事”上

人生也是如此:不用事必躬亲,要学会把重复的事交给合适的人和工具,自己只负责大方向,决定要去哪。

源码地址

1、公众号“Codee君”回复“源码”获取源码

2、pan.baidu.com/s/1B6pgLWfS… 


如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!