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君”回复“源码”获取源码
如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!