main.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "math/rand"
  6. "os"
  7. "time"
  8. "github.com/bxcodec/faker/v3"
  9. "github.com/mhaya/game/game_cluster/internal/mdb/eventmodels"
  10. "gorm.io/driver/clickhouse"
  11. "gorm.io/gorm"
  12. "gorm.io/gorm/logger"
  13. )
  14. // `insert into assets_event_contents (user_id, user_name, tg_id, x_id, parent_user_id, is_robot, points_rank_seq,
  15. // throw_dice_rank_seq, invite_user_rank_seq, is_success, create_at, operation_type,
  16. // currency, reason, before_balance, amount, after_balance, server_id)
  17. // values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
  18. type NameData struct {
  19. User_id string
  20. User_name string
  21. Tg_id string
  22. X_id string
  23. }
  24. func main() {
  25. dsn := "clickhouse://default:123456@192.168.0.193:9000/default?dial_timeout=10s&read_timeout=20s"
  26. newLogger := logger.New(
  27. log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的地方,这里是标准输出)
  28. logger.Config{
  29. SlowThreshold: time.Second, // 慢 SQL 阈值
  30. LogLevel: logger.Info, // 日志级别
  31. Colorful: true, // 彩色打印
  32. },
  33. )
  34. db, err := gorm.Open(clickhouse.Open(dsn), &gorm.Config{
  35. Logger: newLogger,
  36. })
  37. if err != nil {
  38. panic("failed to connect database")
  39. }
  40. datas := make([]*eventmodels.AssetsEventContent, 0, 8)
  41. count := 100
  42. nameDatas := make([]*NameData, 0, 8)
  43. for i := 0; i < 10; i++ {
  44. user_id := faker.Name()
  45. name := faker.Name()
  46. tg_id := faker.Name()
  47. x_id := faker.Name()
  48. nameObj := &NameData{
  49. User_id: user_id,
  50. User_name: name,
  51. Tg_id: tg_id,
  52. X_id: x_id,
  53. }
  54. nameDatas = append(nameDatas, nameObj)
  55. }
  56. server_id := "m-web-admin-1"
  57. for i := 0; i < count; i++ {
  58. index := rand.Intn(len(nameDatas))
  59. user_id := nameDatas[index].User_id
  60. user_name := nameDatas[index].User_name
  61. tg_id := nameDatas[index].Tg_id
  62. x_id := nameDatas[index].X_id
  63. parent_user_id := nameDatas[index].User_name
  64. is_robot := false
  65. points_rank_seq := faker.RandomUnixTime()
  66. throw_dice_rank_seq := faker.RandomUnixTime()
  67. invite_user_rank_seq := faker.RandomUnixTime()
  68. is_success := func() bool {
  69. return rand.Intn(2) == 1
  70. }
  71. create_at := faker.RandomUnixTime()
  72. operation_type := func() string {
  73. if rand.Intn(2) == 1 {
  74. return "increase"
  75. }
  76. return "decrease"
  77. }
  78. currency := func() string {
  79. index := rand.Intn(3)
  80. if index == 1 {
  81. return "POINTS"
  82. }
  83. if index == 2 {
  84. return "TON"
  85. }
  86. return "USDT"
  87. }
  88. reason := func() string {
  89. if rand.Intn(2) == 1 {
  90. return "reason"
  91. }
  92. return ""
  93. }
  94. var before_balance int64
  95. var amount int64
  96. var after_balance int64
  97. before_balance = rand.Int63n(100000)
  98. amount = rand.Int63n(1000)
  99. after_balance = before_balance + amount
  100. // email := faker.Email()
  101. // address := faker.Address()
  102. // phone := faker.Phone()
  103. datas = append(datas, &eventmodels.AssetsEventContent{
  104. UserBasic: eventmodels.UserBasic{
  105. UserId: user_id,
  106. UserName: user_name,
  107. TgId: tg_id,
  108. XId: x_id,
  109. ParentUserId: parent_user_id,
  110. IsRobot: is_robot,
  111. PointsRankSeq: points_rank_seq,
  112. ThrowDiceRankSeq: throw_dice_rank_seq,
  113. InviteUserRankSeq: invite_user_rank_seq,
  114. },
  115. EventBasic: eventmodels.EventBasic{
  116. ServerId: server_id,
  117. IsSuccess: is_success(),
  118. CreateAt: create_at,
  119. },
  120. OperationType: operation_type(),
  121. Currency: currency(),
  122. Reason: reason(),
  123. BeforeBalance: before_balance,
  124. Amount: amount,
  125. AfterBalance: after_balance,
  126. })
  127. }
  128. err = db.CreateInBatches(datas, len(datas)).Error
  129. if err != nil {
  130. fmt.Printf("CreateInBatches error:%v", err)
  131. return
  132. }
  133. // sqlStr := `select SUM(amount) as total_amount from assets_event_contents where user_id = ? and currency = ?`
  134. var total_amount int64
  135. for _, nameObj := range nameDatas {
  136. // err := db.Raw(sqlStr, name, "USDT").Pluck("SUM(amount) as total_amount", &total_amount).Error
  137. // if err != nil {
  138. // fmt.Printf("Pluck error:%v", err)
  139. // return
  140. // }
  141. where := &eventmodels.AssetsEventContent{
  142. UserBasic: eventmodels.UserBasic{
  143. UserId: nameObj.User_id,
  144. // UserId: "1", // 不存在的用户
  145. },
  146. EventBasic: eventmodels.EventBasic{
  147. ServerId: server_id,
  148. },
  149. Currency: "USDT",
  150. }
  151. err := db.Model(&eventmodels.AssetsEventContent{}).Where(where).Pluck("SUM(amount) as total_amount", &total_amount).Error
  152. if err != nil {
  153. fmt.Printf("Pluck error:%v", err)
  154. return
  155. }
  156. fmt.Printf("User_id:%s total_amount:%v", nameObj.User_id, total_amount)
  157. }
  158. }