项目环境
操作系统:windows 11
数据库:mysql 8.0.36
IDE:Goland 2024.2.3
具体步骤
GORM基本操作
GORM参考文档:gorm.io/zh_CN/docs/…
- 快速入门:
import相关包可用 go mod tidy 下载
如遇到下载失败,可以检查GOPROXY go env GOPROXY
设置国内源:go env -w GOPROXY=https://goproxy.cn,direct
这段代码是一个基于 Go 和 GORM 框架的简单示例程序 (来自GORM的快速入门),展示了如何连接到 MySQL 数据库并执行基本的 CRUD(创建、读取、更新、删除)操作。
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
//dsn := "your_username:your_password@tcp(127.0.0.1:3306)/your_db?charset=utf8mb4&parseTime=True&loc=Local"
dsn := "root:root@tcp(127.0.0.1:3306)/my_test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 迁移 schema
db.AutoMigrate(&Product{})
// Create
db.Create(&Product{Code: "D42", Price: 100})
// Read
var product Product
db.First(&product, 1) // 根据整型主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
// Update - 将 product 的 price 更新为 200
db.Model(&product).Update("Price", 200)
// Update - 更新多个字段
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
// Delete - 删除 product
db.Delete(&product, 1)
}
1. 引入包
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
gorm.io/driver/mysql:这是 GORM 的 MySQL 驱动程序,用于连接 MySQL 数据库。gorm.io/gorm:这是 GORM 的核心库,提供 ORM 功能。
2. 定义数据模型
type Product struct {
gorm.Model
Code string
Price uint
}
-
定义了一个
Product结构体,表示数据库中的Product表。 -
gorm.Model是 GORM 提供的一个通用结构体,包含以下字段:ID:主键CreatedAt:记录创建时间UpdatedAt:记录更新时间DeletedAt:软删除时间(用于标记是否被删除)
-
Code和Price是自定义字段,分别表示产品的代码和价格。
3. 连接数据库
dsn := "root:root@tcp(127.0.0.1:3306)/my_test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
-
dsn:表示 MySQL 数据库的连接字符串。root:root:数据库用户名和密码。127.0.0.1:3306:数据库的地址和端口。my_test:数据库名称。charset=utf8mb4:设置字符集为utf8mb4,支持表情符号等。parseTime=True:启用解析时间。loc=Local:设置时区为本地时间。
-
gorm.Open:使用 GORM 打开数据库连接。 -
如果连接失败,会调用
panic抛出错误并终止程序。
4. 自动迁移
db.AutoMigrate(&Product{})
- 这是 GORM 的自动迁移功能,会根据
Product结构体的定义在数据库中创建(或更新)表。 - 如果表已经存在但字段有变化,它会自动更新表结构。
5. 创建数据
db.Create(&Product{Code: "D42", Price: 100})
- 创建一个
Product记录,Code字段为"D42",Price字段为100。 - GORM 会自动生成
INSERTSQL 语句并插入到数据库中。
6. 读取数据
var product Product
db.First(&product, 1) // 根据整型主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
db.First(&product, 1):根据主键1查找第一个匹配的记录。db.First(&product, "code = ?", "D42"):通过条件查询,查找Code为"D42"的第一条记录。- 查询的结果会存储到变量
product中。
7. 更新数据
db.Model(&product).Update("Price", 200)
- 更新单个字段,将
product的Price字段更新为200。
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
Updates(Product{Price: 200, Code: "F42"}):将Price和Code字段更新为200和"F42",GORM 会跳过结构体中的零值字段(如未赋值的字段)。Updates(map[string]interface{}{"Price": 200, "Code": "F42"}):使用map进行更新,指定更新的字段和值。
8. 删除数据
db.Delete(&product, 1)
- 删除主键为
1的Product记录。 - 实际上,如果模型中包含
gorm.Model的话,这是一个软删除操作(记录不会物理删除,而是设置DeletedAt字段)。