This commit is contained in:
GYJ
2025-03-18 14:34:50 +08:00
commit f85fff80be
17 changed files with 544 additions and 0 deletions

125
db/copy_data.go Normal file
View File

@@ -0,0 +1,125 @@
package db
import (
"fmt"
"github.com/jinzhu/copier"
"gorm.io/gorm"
"time"
"video_data_copy/data"
)
func copyOrders(db *gorm.DB, timeNow time.Time) {
order := &data.Orders{}
db.Model(order).Where("create_time < ?", timeNow.Format("2006-01-02 15:04:05")).Order("create_time asc").First(order)
parse, err := time.Parse("2006-01-02T15:04:05Z07:00", order.CreateTime)
if err != nil {
fmt.Println("parse order create_time error:", err)
}
format := parse.Format("2006-01-02 15:04:05")
fmt.Println("copy orders from:", format)
db.Debug().Where("create_time >= ?", format).Delete(&data.OrdersCopy1{})
_execOrders(db, timeNow.Format("2006-01-02 15:04:05"), 0)
}
func _execOrders(db *gorm.DB, timeNow string, index int) {
var orders []*data.Orders
db.Debug().Where("create_time < ?", timeNow).Limit(1000).Offset(index * 1000).Find(&orders)
fmt.Printf("index: %d, timeNow: %s ,orders count: %d\n", index, timeNow, len(orders))
if len(orders) == 0 {
return
}
var copyList []*data.OrdersCopy1
for _, order := range orders {
copyOrder := &data.OrdersCopy1{}
CopyStruct(order, copyOrder)
copyList = append(copyList, copyOrder)
}
db.Create(&copyList)
_execOrders(db, timeNow, index+1)
}
func copyPayDetails(db *gorm.DB, timeNow time.Time) {
detail := &data.PayDetails{}
db.Model(detail).Where("create_time < ?", timeNow.Format("2006-01-02 15:04:05")).Order("create_time asc").First(detail)
parse, err := time.Parse("2006-01-02T15:04:05Z07:00", detail.CreateTime)
if err != nil {
fmt.Println("parse pay_details create_time error:", err)
}
format := parse.Format("2006-01-02 15:04:05")
fmt.Println("copy pay_details from:", format)
db.Debug().Where("create_time >= ?", format).Delete(&data.PayDetailsCopy1{})
_execPayDetails(db, timeNow.Format("2006-01-02 15:04:05"), 0)
}
func _execPayDetails(db *gorm.DB, timeNow string, index int) {
var details []*data.PayDetails
db.Debug().Where("create_time < ?", timeNow).Limit(1000).Offset(index * 1000).Find(&details)
fmt.Printf("index: %d, timeNow: %s ,pay_details count: %d\n", index, timeNow, len(details))
if len(details) == 0 {
return
}
var copyList []*data.PayDetailsCopy1
for _, detail := range details {
detailCopy := &data.PayDetailsCopy1{}
CopyStruct(detail, detailCopy)
copyList = append(copyList, detailCopy)
}
db.Create(&copyList)
_execPayDetails(db, timeNow, index+1)
}
func copyUserMoneyDetails(db *gorm.DB, timeNow time.Time) {
detail := &data.UserMoneyDetails{}
db.Model(detail).Where("create_time < ?", timeNow.Format("2006-01-02 15:04:05")).Order("create_time asc").First(detail)
parse, err := time.Parse("2006-01-02T15:04:05Z07:00", detail.CreateTime)
if err != nil {
fmt.Println("parse pay_details create_time error:", err)
}
format := parse.Format("2006-01-02 15:04:05")
fmt.Println("copy pay_details from:", format)
db.Debug().Where("create_time >= ?", format).Delete(&data.UserMoneyDetailsCopy1{})
_execUserMoneyDetails(db, timeNow.Format("2006-01-02 15:04:05"), 0)
}
func _execUserMoneyDetails(db *gorm.DB, timeNow string, index int) {
var details []*data.UserMoneyDetails
db.Debug().Where("create_time < ?", timeNow).Limit(1000).Offset(index * 1000).Find(&details)
fmt.Printf("index: %d, timeNow: %s ,pay_details count: %d\n", index, timeNow, len(details))
if len(details) == 0 {
return
}
var copyList []*data.UserMoneyDetailsCopy1
for _, detail := range details {
detailCopy := &data.UserMoneyDetailsCopy1{}
CopyStruct(detail, detailCopy)
copyList = append(copyList, detailCopy)
}
db.Create(&copyList)
_execUserMoneyDetails(db, timeNow, index+1)
}
// CopyStruct 使用反射复制结构体
func CopyStruct(src, dst interface{}) {
_ = copier.Copy(dst, src)
}

17
db/db_config.go Normal file
View File

@@ -0,0 +1,17 @@
package db
type (
ConnectInfo struct {
Host string `yaml:"host" json:"host"`
Name string `yaml:"name" json:"name"`
Password string `yaml:"password" json:"password"`
Port string `yaml:"port" json:"port"`
Dbs []string `yaml:"dbs" json:"dbs"`
}
Config struct {
Env string `yaml:"env" json:"env"`
Dev *ConnectInfo `yaml:"dev" json:"dev"`
Prod *ConnectInfo `yaml:"prod" json:"prod"`
}
)

95
db/db_manager.go Normal file
View File

@@ -0,0 +1,95 @@
package db
import (
"fmt"
"gopkg.in/yaml.v3"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"os"
"time"
)
var (
config *Config
dbList []*gorm.DB
)
func ConnectDB() {
_loadConfig()
_goConnectDB()
}
func CopyData() {
if len(dbList) == 0 {
panic("dbList is nil")
}
timeNow := time.Now().Add(-30 * 24 * time.Hour)
for _, db := range dbList {
copyOrders(db, timeNow)
copyPayDetails(db, timeNow)
copyUserMoneyDetails(db, timeNow)
}
}
func DisconnectDB() {
for _, db := range dbList {
s, err := db.DB()
if err != nil {
continue
}
_ = s.Close()
}
}
func _loadConfig() {
// 读取YAML文件内容
yamlFile, err := os.ReadFile("db_config.yml")
if err != nil {
panic(err)
}
c := &Config{}
err = yaml.Unmarshal(yamlFile, c)
if err != nil {
panic(err)
}
config = c
}
func _goConnectDB() {
if config == nil {
panic("config is nil")
}
if config.Env != "dev" && config.Env != "prod" {
panic("config.Env is not valid")
}
configInfo := config.Dev
if config.Env == "prod" {
configInfo = config.Prod
}
for _, dbInfo := range configInfo.Dbs {
connectUrl := _getDbConnectUrl(configInfo, dbInfo)
db, err := gorm.Open(mysql.Open(connectUrl))
if err != nil {
panic(err)
}
dbList = append(dbList, db)
}
fmt.Println("Connect to DB success")
}
func _getDbConnectUrl(configInfo *ConnectInfo, dbName string) string {
return configInfo.Name +
":" +
configInfo.Password +
"@tcp(" + configInfo.Host + ":" + configInfo.Port + ")/" +
dbName +
"?charset=utf8mb4&parseTime=True&loc=Local"
}