TeamClass_MD/Go入门速成/Day2/Class3 Gorm的使用.md
2025-03-19 21:56:31 +08:00

118 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Gorm的使用
## Gorm是什么
- GORM 是 Go 语言的 ORM 库,提供模型定义、关联管理、事务支持、查询构建、数据迁移、钩子回调等功能,支持主流数据库(如 MySQL/PostgreSQL/SQLite简化数据库操作。
## 如何使用Gorm
### 导入Gorm库
```go
import (
"gorm.io/driver/mysql"
)
```
### 连接数据库
```go
func main() {
// 初始化 Viper
viper.SetConfigName("config") // 配置文件名称(不带扩展名)
viper.SetConfigType("toml") // 配置文件类型
viper.AddConfigPath(".") // 配置文件路径
if err := viper.ReadInConfig(); err != nil {
log.Fatalf("Error reading config file: %v", err)
}
// 获取 database 配置
database := map[string]string{
"user": viper.GetString("mysql.user"),
"password": viper.GetString("mysql.password"),
"host": viper.GetString("mysql.host"),
"port": viper.GetString("mysql.port"),
"database": viper.GetString("mysql.database"),
}
// 打印 database 配置
fmt.Println("Database Config:", database)
// 构建 DSN数据源名称
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
database["user"],
database["password"],
database["host"],
database["port"],
database["database"],)
// 连接数据库
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
`````
### 数据库定义模型(表格)
- 在Gorm中定义一张表使用的是结构体
```go
type User struct {
gorm.Model
Name string
Age int
}
```
### 自动迁移表结构与创建表格
- 自动迁移表结构方便我们修改表给表添加参数同时如果没有该名字的表Gorm则会创建他
```go
if err := db.AutoMigrate(&User{}); err != nil {
log.Fatalf("Failed to auto migrate: %v", err)
}
```
### CRUD操作
#### 创建数据
```go
//创建
user:=User{
Name: "John",
Age: 30,
}
if err := db.Create(&user).Error; err != nil {
log.Fatalf("Failed to create user: %v", err)
}
fmt.Println("User created successfully!")
```
#### 查询数据
```go
//搜索数
//单一搜索
var user1,user2,user3 User
if err := db.First(&user1, 1).Error; err != nil {
log.Fatalf("Failed to find user: %v", err)
}
user2.Name = "Jane"
if err=db.First(&user2).Error;err!=nil{
log.Fatalf("Failed to find user: %v", err)
}
if err:=db.Where("name = ?", "Alice").First(&user3);err!=nil{
log.Fatalf("Failed to find user: %v", err)
}
//查询多条记录
var users []User
if err:=db.Where("age > ?", 20).Find(&users);err!=nil{
log.Fatalf("Failed to find users: %v", err)
}
// 查询时避免RecordNotFound错误
err := db.Where("name = ?", "Bob").First(&user).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
fmt.Println("User not found")
}
```
#### 更新记录
- update方式
```go
// 更新单个字段
db.Model(&user).Update("Age", 30)
// 更新多个字段零值需使用map
db.Model(&user).Updates(map[string]interface{}{"Age": 30, "Name": ""})
// 使用结构体更新(忽略零值)
db.Model(&user).Updates(User{Name: "Alice", Age: 0}) // Age不会被更新
```
- save方式
```
db.Save(&user) //更新所有字段
db.Save(&user).Omit("Name") //更新除Name字段外的所有字段
```
#### 删除记录
```go
db.Delete(&user) //软删除
db.Unscoped().Delete(&user) //直接强制删除
```