You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
4.1 KiB

4 years ago
  1. package db
  2. import (
  3. "leit.com/LAPP_GAAS_GFrame/conf"
  4. "context"
  5. "fmt"
  6. _ "github.com/denisenkom/go-mssqldb"
  7. _ "github.com/go-sql-driver/mysql"
  8. "github.com/go-xorm/xorm"
  9. "go.mongodb.org/mongo-driver/bson"
  10. "go.mongodb.org/mongo-driver/mongo"
  11. "go.mongodb.org/mongo-driver/mongo/options"
  12. "log"
  13. "sync"
  14. "time"
  15. )
  16. var (
  17. Eloquent *xorm.EngineGroup
  18. elock sync.Mutex
  19. mgoDb *mongo.Client
  20. mlock sync.Mutex
  21. PlantNr int
  22. )
  23. //初始化数据库
  24. func InitDb() error {
  25. elock.Lock()
  26. defer elock.Unlock()
  27. //数据库信息
  28. dataDb := FindData()
  29. //从库集合
  30. var err error
  31. var master *xorm.Engine
  32. slaves := []*xorm.Engine{}
  33. for _, v := range dataDb {
  34. if v.Sourcetype == "Master" {
  35. switch v.DriverName {
  36. case "mssql":
  37. driveSource := fmt.Sprintf("server=%s;database=%s;user id=%s;password=%s;port=%d;encrypt=disable",
  38. v.Host, v.DbName, v.User, v.Pwd, v.Port)
  39. master, err = xorm.NewEngine("mssql", driveSource)
  40. if err != nil {
  41. fmt.Printf("err1 is %v", err)
  42. return err
  43. }
  44. case "mysql":
  45. driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8",
  46. v.User, v.Pwd, v.Host, v.Port, v.DbName)
  47. master, err = xorm.NewEngine("mysql", driveSource)
  48. if err != nil {
  49. fmt.Printf("err2 is %v", err)
  50. return err
  51. }
  52. }
  53. } else {
  54. switch v.DriverName {
  55. case "mssql":
  56. driveSource := fmt.Sprintf("server=%s;database=%s;user id=%s;password=%s;port=%d;encrypt=disable",
  57. v.Host, v.DbName, v.User, v.Pwd, v.Port)
  58. slave, err := xorm.NewEngine("mssql", driveSource)
  59. if err != nil {
  60. fmt.Printf("err1 is %v", err)
  61. return err
  62. }
  63. slaves = append(slaves, slave)
  64. case "mysql":
  65. driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8",
  66. v.User, v.Pwd, v.Host, v.Port, v.DbName)
  67. slave, err := xorm.NewEngine("mysql", driveSource)
  68. if err != nil {
  69. fmt.Printf("err2 is %v", err)
  70. return err
  71. }
  72. slaves = append(slaves, slave)
  73. }
  74. }
  75. }
  76. Eloquent, err = xorm.NewEngineGroup(master, slaves)
  77. if err != nil {
  78. return err
  79. }
  80. Eloquent.ShowSQL(true)
  81. return nil
  82. }
  83. //创建mongoDb数据库链接
  84. func MgoDb() *mongo.Client {
  85. //判断mgoDb是否存在
  86. if mgoDb != nil {
  87. return mgoDb
  88. }
  89. //创建之前会涉及并发,所以要加锁
  90. mlock.Lock()
  91. defer mlock.Unlock()
  92. //细节,防止多个请求锁住
  93. if mgoDb != nil {
  94. return mgoDb
  95. }
  96. //1.建立链接
  97. ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
  98. client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
  99. if err != nil {
  100. log.Fatal("dbhelper.MgoDb error= ", err)
  101. return nil
  102. } else {
  103. mgoDb = client
  104. return mgoDb
  105. }
  106. }
  107. //数据库
  108. type Database struct {
  109. ID string `bson:"id" json:"database-id"` //ID:uuid唯一字符串
  110. DbName string `bson:"dbname" json:"database-dbname"` //数据库名称
  111. DriverName string `bson:"drivername" json:"database-drivername"` //引擎类型
  112. Host string `bson:"host" json:"database-host"` //链接地址
  113. Port int `bson:"port" json:"database-port"` //端口号
  114. User string `bson:"user" json:"database-user"` //用户名
  115. Pwd string `bson:"pwd" json:"database-pwd"` //密码
  116. Sourcetype string `bson:"sourcetype" json:"database-sourcetype"` //主库和从库
  117. }
  118. func FindData() []*Database {
  119. limit := int64(500)
  120. skip := int64(0)
  121. //1.初始化链接
  122. client := MgoDb()
  123. //2.选择数据库,数据表
  124. collect := client.Database(conf.DbConfig.Mongdbname).Collection("database")
  125. //var skip int64 = 0//从那个开始
  126. //var limit int64 = 2//炼制几个输出字段
  127. cursor, err := collect.Find(context.TODO(), bson.D{
  128. }, &options.FindOptions{
  129. Skip: &skip,
  130. Limit: &limit,
  131. Sort: bson.D{{"id", -1}},
  132. })
  133. fmt.Println(cursor)
  134. if err != nil {
  135. return nil
  136. }
  137. defer cursor.Close(context.TODO())
  138. //创建需要反序列化成什么样子的结构体对象
  139. records := make([]*Database, 0)
  140. for cursor.Next(context.TODO()) {
  141. record := &Database{}
  142. //反序列化
  143. err = cursor.Decode(record)
  144. if err != nil {
  145. fmt.Println(err)
  146. return nil
  147. }
  148. //追加
  149. records = append(records, record)
  150. }
  151. return records
  152. }