以下是一个使用 GORM 实现增删改查(CRUD)操作的完整示例。这个示例演示了如何连接到数据库、定义模型、创建记录、查询记录、更新记录和删除记录。
先决条件
- 安装 GORM 库和适当的数据库驱动(例如,SQLite 驱动):
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
示例代码
1. 导入必要的包
package main
import (
"fmt"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
2. 定义模型
type User struct {
ID uint `gorm:"primaryKey"`
Name string
Email string
}
3. 连接到数据库
func main() {
// 连接到 SQLite 数据库
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移模式
db.AutoMigrate(&User{})
4. 创建记录
// 创建记录
user := User{Name: "John", Email: "john@example.com"}
result := db.Create(&user)
if result.Error != nil {
fmt.Println("Failed to create user:", result.Error)
} else {
fmt.Println("User created:", user)
}
5. 查询记录
// 查询记录
var queriedUser User
db.First(&queriedUser, user.ID)
fmt.Println("Queried User:", queriedUser)
6. 更新记录
// 更新记录
db.Model(&queriedUser).Update("Email", "john_updated@example.com")
fmt.Println("Updated User:", queriedUser)
7. 删除记录
// 删除记录
db.Delete(&queriedUser)
fmt.Println("User deleted")
}
8. 完整代码
package main
import (
"fmt"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// User 模型
type User struct {
ID uint `gorm:"primaryKey"`
Name string
Email string
}
func main() {
// 连接到 SQLite 数据库
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移模式
db.AutoMigrate(&User{})
// 创建记录
user := User{Name: "John", Email: "john@example.com"}
result := db.Create(&user)
if result.Error != nil {
fmt.Println("Failed to create user:", result.Error)
} else {
fmt.Println("User created:", user)
}
// 查询记录
var queriedUser User
db.First(&queriedUser, user.ID)
fmt.Println("Queried User:", queriedUser)
// 更新记录
db.Model(&queriedUser).Update("Email", "john_updated@example.com")
fmt.Println("Updated User:", queriedUser)
// 删除记录
db.Delete(&queriedUser)
fmt.Println("User deleted")
}
解释
- 定义模型:
-
User模型定义了ID、Name和Email字段。
- 连接数据库:
-
- 使用 GORM 连接到 SQLite 数据库并自动迁移
User模型。
- 使用 GORM 连接到 SQLite 数据库并自动迁移
- 创建记录:
-
- 创建一个
User实例并插入到数据库中。
- 创建一个
- 查询记录:
-
- 根据
ID查询刚创建的用户。
- 根据
- 更新记录:
-
- 更新查询到的用户的
Email字段。
- 更新查询到的用户的
- 删除记录:
-
- 删除查询到的用户。
通过这个完整的示例,您可以了解如何使用 GORM 执行基本的 CRUD 操作。如果需要使用其他数据库(如 MySQL、PostgreSQL 等),只需更改数据库驱动和连接方式即可。
使用带有 Context 上下文的操作
在使用 GORM 时,可以通过上下文(context)来进行操作,以便更好地控制数据库操作的生命周期,支持超时、取消等特性。以下是一个带有 context 的 GORM 操作示例。
package main
import (
"context"
"fmt"
"time"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// User 模型
type User struct {
ID uint `gorm:"primaryKey"`
Name string
Email string
}
func main() {
// 连接到 SQLite 数据库
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移模式
db.AutoMigrate(&User{})
// 创建一个 context,设置超时为 5 秒
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// 创建记录
user := User{Name: "John", Email: "john@example.com"}
if err := db.WithContext(ctx).Create(&user).Error; err != nil {
fmt.Println("Failed to create user:", err)
} else {
fmt.Println("User created:", user)
}
// 查询记录
var queriedUser User
if err := db.WithContext(ctx).First(&queriedUser, user.ID).Error; err != nil {
fmt.Println("Failed to query user:", err)
} else {
fmt.Println("Queried User:", queriedUser)
}
// 更新记录
if err := db.WithContext(ctx).Model(&queriedUser).Update("Email", "john_updated@example.com").Error; err != nil {
fmt.Println("Failed to update user:", err)
} else {
fmt.Println("Updated User:", queriedUser)
}
// 删除记录
if err := db.WithContext(ctx).Delete(&queriedUser).Error; err != nil {
fmt.Println("Failed to delete user:", err)
} else {
fmt.Println("User deleted")
}
}