在这篇文章中,我们将通过 GORM(Go 的 ORM 库)连接 MySQL 数据库,并实现一个电商系统的商品增删改查(CRUD)操作。
1. 环境准备
首先,安装 Go、MySQL、GORM 和 MySQL 驱动。
使用 go get 安装 GORM 和 MySQL 驱动:
go get -u github.com/jinzhu/gorm
go get -u github.com/jinzhu/gorm/dialects/mysql
2. 创建数据库和表
在 MySQL 中创建一个名为 ecommerce 的数据库,并在其中创建一个 products 表,用于存储商品信息。可以通过以下 SQL 语句创建表:
CREATE DATABASE ecommerce;
USE ecommerce;
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
stock INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3. GORM 配置与数据库连接
在 Go 中使用 GORM,我们首先需要创建一个连接到 MySQL 数据库的实例。为了方便起见,我们将所有的数据库操作封装在一个包里。如果找不到 GORM 或者驱动可以在写完 main.go 后运行一下 go mod tidy 。
首先,定义一个结构体来表示商品(Product)的数据模型。假设我们的商品包含以下字段:
ID: 商品的唯一标识符(主键)。Name: 商品名称。Description: 商品描述。Price: 商品价格。Stock: 商品库存。CreatedAt: 商品创建时间(使用 GORM 的autoCreateTime标签,自动生成时间)。
main.go
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
"time"
)
// Product 商品结构体
type Product struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100;not null"`
Description string `gorm:"type:text"`
Price float64 `gorm:"not null"`
Stock int `gorm:"not null"`
CreatedAt time.Time `gorm:"autoCreateTime"`
}
// 初始化数据库连接
func initDB() *gorm.DB {
dsn := "root:password@tcp(127.0.0.1:3306)/ecommerce?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("failed to connect to database: %v", err)
}
return db
}
// 初始化数据库表结构
func migrate(db *gorm.DB) {
db.AutoMigrate(&Product{})
}
func main() {
db := initDB()
migrate(db)
// 创建商品
createProduct(db)
// 查询所有商品
getAllProducts(db)
// 更新第一个商品的价格和库存
updateProduct(db, 1)
// 查询更新后的商品
getAllProducts(db)
// 删除商品
deleteProduct(db, 1)
// 查询删除后的商品
getAllProducts(db)
}
在这个例子中,我们首先定义了一个 Product 结构体,它与数据库中的 products 表相对应。接着,我们定义了 initDB 函数来初始化数据库连接,migrate 函数用于自动迁移和创建表结构。
AutoMigrate
AutoMigrate 是 GORM 提供的一个功能,它用于根据 Go 结构体自动生成和更新数据库中的表结构。AutoMigrate 会根据 Go 结构体中的字段类型和标签,自动创建或修改数据库表的结构,例如新增字段、修改字段类型、添加索引等。
GORM 的 AutoMigrate 方法会根据给定的模型(结构体)自动迁移数据库表。它会执行以下操作:
- 创建表:如果表不存在,
AutoMigrate会创建一个新的表。 - 新增字段:如果数据库表中缺少某个字段,
AutoMigrate会添加这个字段。 - 修改字段类型:如果字段类型发生变化(例如修改了字段的长度、类型等),它会自动更新数据库中的字段。
- 不删除字段:
AutoMigrate不会删除表中已有的字段,所以它是一个非破坏性的操作。
4. 实现商品的增删改查操作
为了方便起见,我们直接进行特定的修改操作,不通过参数指定。
4.1 添加商品
使用 GORM 来创建商品记录非常简单,创建一个新的 Product 结构体实例来表示一条商品记录,然后调用 GORM 的 Create 方法将它插入到数据库中。插入时,ID 字段会由数据库自动生成:
func createProduct(db *gorm.DB) {
product := Product{
Name: "Go 语言入门书籍",
Description: "一本非常好的 Go 语言书籍,适合初学者。",
Price: 99.99,
Stock: 50,
}
result := db.Create(&product)
if result.Error != nil {
fmt.Println("创建商品失败:", result.Error)
} else {
fmt.Printf("商品创建成功,ID: %d\n", product.ID)
}
}
4.2 获取所有商品
使用 GORM 提供的查询方法,如 Find 或 First,从数据库中检索商品数据。Find 用于查询多个商品,First 用于查询符合条件的第一个商品。通过 Find 方法,我们可以获取所有商品:
func getAllProducts(db *gorm.DB) {
var products []Product
result := db.Find(&products)
if result.Error != nil {
fmt.Println("查询商品失败:", result.Error)
} else {
fmt.Println("所有商品:")
for _, product := range products {
fmt.Printf("ID: %d, Name: %s, Price: %.2f, Stock: %d\n", product.ID, product.Name, product.Price, product.Stock)
}
}
}
4.3 更新商品信息
更新商品时,我们可以通过 Save 或 Updates 方法:
func updateProduct(db *gorm.DB, productID uint) {
var product Product
if err := db.First(&product, productID).Error; err != nil {
fmt.Println("商品未找到:", err)
return
}
// 更新商品价格和库存
product.Price = 69.99
product.Stock = 50
result := db.Save(&product)
if result.Error != nil {
fmt.Println("更新商品失败:", result.Error)
} else {
fmt.Printf("商品更新成功: %+v\n", product)
}
}
4.4 删除商品
删除商品时,可以通过 Delete 方法来实现:
func deleteProduct(db *gorm.DB, productID uint) {
result := db.Delete(&Product{}, productID)
if result.Error != nil {
fmt.Println("删除商品失败:", result.Error)
} else {
fmt.Printf("商品删除成功,ID: %d\n", productID)
}
}
在控制台运行 go run main.go ,可以在控制台看到输出:
商品创建成功,ID: 1
所有商品:
ID: 1, Name: Go 语言入门书籍, Price: 99.99, Stock: 50
商品更新成功: {ID:1 Name:Go 语言入门书籍 Description:一本非常好的 Go 语言书籍,适合初学者。 Price:69.99 Stock:50 CreatedAt:2024-11-28 23:21:08.425 +0800 CST}
所有商品:
ID: 1, Name: Go 语言入门书籍, Price: 69.99, Stock: 50
商品删除成功,ID: 1
所有商品:
可以用navicat连接数据库看一下
5. 总结
增、删、改、查,在 GORM 中的实现相对简洁。我们主要通过 GORM 提供的以下方法来操作数据库:
Create: 插入一条记录。Find: 查询多条记录。First: 查询一条记录。Save: 更新一条记录。Delete: 删除一条记录。
通过 GORM 提供的简单方法,我们能够轻松进行数据库操作,简化了 Go 应用程序的数据库管理。