SJA工艺
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.

160 lines
4.1 KiB

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