2025-03-19 21:51:58 +08:00

110 lines
2.9 KiB
Go
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.

package main
import (
"errors"
"fmt"
"log"
"github.com/spf13/viper"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
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)
}
// 打印 db 对象
fmt.Println("Database connection successful:", db)
//自动迁移表结构
if err := db.AutoMigrate(&User{}); err != nil {
fmt.Println("Auto migration failed:", err)
}
fmt.Println("Auto migration successful!")
//创建
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!")
//搜索数据
//单一搜索
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
db.Model(&user).Update("Age", 40)
// 更新多个字段零值需使用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字段外的所有字段
//删除
db.Delete(&user) //软删除
db.Unscoped().Delete(&user) //直接强制删除
}
// 定义 User 模型
type User struct {
gorm.Model
Name string
Age int
}