|
@@ -0,0 +1,173 @@
|
|
|
|
+package main
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "context"
|
|
|
|
+ "database/sql"
|
|
|
|
+ "encoding/json"
|
|
|
|
+ "fmt"
|
|
|
|
+ _ "github.com/go-sql-driver/mysql"
|
|
|
|
+ "github.com/mhaya/game/game_cluster/internal/mdb/models"
|
|
|
|
+ "go.mongodb.org/mongo-driver/mongo"
|
|
|
|
+ "go.mongodb.org/mongo-driver/mongo/options"
|
|
|
|
+ "log"
|
|
|
|
+ "time"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+// MySQL结构体
|
|
|
|
+type MySQLUser struct {
|
|
|
|
+ Username string `json:"username"`
|
|
|
|
+ Nickname string `json:"nickname"`
|
|
|
|
+ Pid string `json:"pid"`
|
|
|
|
+ Level int `json:"level"`
|
|
|
|
+ Money float64 `json:"money"`
|
|
|
|
+ Score int `json:"score"`
|
|
|
|
+ Roll int `json:"roll"`
|
|
|
|
+ Invite int `json:"invite"`
|
|
|
|
+ AllRoll int `json:"allroll"`
|
|
|
|
+ RollDay int `json:"rollday"`
|
|
|
|
+ RollNums int `json:"rollnums"`
|
|
|
|
+ RollDays int `json:"rolldays"`
|
|
|
|
+ TonWall string `json:"tonwall"`
|
|
|
|
+ DrawsNumber int `json:"drawsnumber"`
|
|
|
|
+ DayLimit int `json:"daylimit"`
|
|
|
|
+ Jump int `json:"jump"`
|
|
|
|
+ DayRoll int `json:"dayroll"`
|
|
|
|
+ DayInvite int `json:"dayinvite"`
|
|
|
|
+ DatScore int `json:"datscore"`
|
|
|
|
+ WallTon string `json:"wallton"`
|
|
|
|
+ WallU string `json:"wallu"`
|
|
|
|
+ RollOneStatus int `json:"rollonestatus"`
|
|
|
|
+ FirstReward int `json:"firsteward"`
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MySQL 数据读取
|
|
|
|
+func readFromMySQL() ([]MySQLUser, error) {
|
|
|
|
+ db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/dbname")
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+ defer db.Close()
|
|
|
|
+
|
|
|
|
+ rows, err := db.Query("SELECT * FROM users")
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+ defer rows.Close()
|
|
|
|
+
|
|
|
|
+ var users []MySQLUser
|
|
|
|
+ for rows.Next() {
|
|
|
|
+ var user MySQLUser
|
|
|
|
+ err := rows.Scan(
|
|
|
|
+ &user.Username,
|
|
|
|
+ &user.Nickname,
|
|
|
|
+ &user.Pid,
|
|
|
|
+ &user.Level,
|
|
|
|
+ &user.Money,
|
|
|
|
+ &user.Score,
|
|
|
|
+ &user.Roll,
|
|
|
|
+ &user.Invite,
|
|
|
|
+ &user.AllRoll,
|
|
|
|
+ &user.RollDay,
|
|
|
|
+ &user.RollNums,
|
|
|
|
+ &user.RollDays,
|
|
|
|
+ &user.TonWall,
|
|
|
|
+ &user.DrawsNumber,
|
|
|
|
+ &user.DayLimit,
|
|
|
|
+ &user.Jump,
|
|
|
|
+ &user.DayRoll,
|
|
|
|
+ &user.DayInvite,
|
|
|
|
+ &user.DatScore,
|
|
|
|
+ &user.WallTon,
|
|
|
|
+ &user.WallU,
|
|
|
|
+ &user.RollOneStatus,
|
|
|
|
+ &user.FirstReward,
|
|
|
|
+ )
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+ users = append(users, user)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return users, nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 数据转换
|
|
|
|
+func convertToMongo(user MySQLUser) (models.Player, error) {
|
|
|
|
+ var mongoUser models.Player
|
|
|
|
+ err := json.Unmarshal([]byte(fmt.Sprintf(`%v`, user)), &mongoUser)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return mongoUser, err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 填充其他字段
|
|
|
|
+ mongoUser.UserName = user.Username
|
|
|
|
+ mongoUser.NickName = user.Nickname
|
|
|
|
+ mongoUser.Pid = user.Pid
|
|
|
|
+ mongoUser.Level = user.Level
|
|
|
|
+ mongoUser.Exp = user.Score // 假设Exp和Score相同
|
|
|
|
+ mongoUser.CreateTime = time.Now().Unix()
|
|
|
|
+ mongoUser.UpdateTime = time.Now().Unix()
|
|
|
|
+ mongoUser.DailyRefreshTime = time.Now().Unix()
|
|
|
|
+ mongoUser.WeeklyRefreshTime = time.Now().Unix()
|
|
|
|
+ //mongoUser.RollDay = user.RollDay
|
|
|
|
+ mongoUser.Status = 1 // 默认状态
|
|
|
|
+ mongoUser.Index = 1 // 默认索引
|
|
|
|
+ mongoUser.TonWall = user.TonWall
|
|
|
|
+ mongoUser.JoinTime = time.Now().Unix()
|
|
|
|
+ mongoUser.JoinIP = "127.0.0.1"
|
|
|
|
+
|
|
|
|
+ // 初始化其他结构体
|
|
|
|
+ //mongoUser.Roll = &models.Roll{}
|
|
|
|
+ //mongoUser.Share = &models.RShare{}
|
|
|
|
+ //mongoUser.Item = models.RItemBasePack{}
|
|
|
|
+ //mongoUser.SinIn = models.RSignIn{}
|
|
|
|
+ //mongoUser.DailyTask = models.RDailyTask{}
|
|
|
|
+ //mongoUser.AchieveTask = models.RAchieveTask{}
|
|
|
|
+ //mongoUser.RankReward = models.RRankReward{}
|
|
|
|
+ //mongoUser.Invite = models.RInvite{}
|
|
|
|
+ //mongoUser.InviteReward = &models.RInviteReward{}
|
|
|
|
+ //mongoUser.PlayerReward = make(map[int]*models.RPlayerRewardBase)
|
|
|
|
+
|
|
|
|
+ return mongoUser, nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 插入MongoDB
|
|
|
|
+func insertIntoMongo(users []MySQLUser) error {
|
|
|
|
+ clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
|
|
|
|
+ client, err := mongo.Connect(context.TODO(), clientOptions)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ defer client.Disconnect(context.TODO())
|
|
|
|
+
|
|
|
|
+ collection := client.Database("game").Collection("players")
|
|
|
|
+
|
|
|
|
+ for _, user := range users {
|
|
|
|
+ mongoUser, err := convertToMongo(user)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ _, err = collection.InsertOne(context.TODO(), mongoUser)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 主函数
|
|
|
|
+func main() {
|
|
|
|
+ users, err := readFromMySQL()
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = insertIntoMongo(users)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ log.Println("Data migration completed successfully.")
|
|
|
|
+}
|