2025-03-19 15:56:43 +08:00
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
2025-03-19 21:50:20 +08:00
|
|
|
|
"errors"
|
2025-03-19 15:56:43 +08:00
|
|
|
|
"fmt"
|
2025-03-19 21:50:20 +08:00
|
|
|
|
"log"
|
2025-03-19 15:56:43 +08:00
|
|
|
|
|
2025-03-19 21:50:20 +08:00
|
|
|
|
"github.com/spf13/viper"
|
2025-03-19 15:56:43 +08:00
|
|
|
|
"gorm.io/driver/mysql"
|
|
|
|
|
"gorm.io/gorm"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func main() {
|
2025-03-19 21:50:20 +08:00
|
|
|
|
// 初始化 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) //直接强制删除
|
2025-03-19 15:56:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-19 21:50:20 +08:00
|
|
|
|
// 定义 User 模型
|
2025-03-19 15:56:43 +08:00
|
|
|
|
type User struct {
|
|
|
|
|
gorm.Model
|
|
|
|
|
Name string
|
|
|
|
|
Age int
|
|
|
|
|
}
|