苏州瑞玛APS项目web后台
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.

230 lines
5.7 KiB

3 years ago
3 years ago
3 years ago
3 years ago
  1. package db
  2. import (
  3. "context"
  4. "errors"
  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. "leit.com/LAPP_CHEERSSON_BACKEND/conf"
  13. "leit.com/LAPP_CHEERSSON_BACKEND/utils"
  14. "log"
  15. "sync"
  16. "time"
  17. )
  18. var (
  19. Eloquent *xorm.EngineGroup
  20. elock sync.Mutex
  21. mgoDb *mongo.Client
  22. mlock sync.Mutex
  23. )
  24. //初始化数据库
  25. func InitDb() error {
  26. elock.Lock()
  27. defer elock.Unlock()
  28. //数据库信息
  29. dataDb := FindData()
  30. //从库集合
  31. var err error
  32. var master *xorm.Engine
  33. slaves := []*xorm.Engine{}
  34. for _, v := range dataDb {
  35. if v.Sourcetype == "Master" {
  36. switch v.DriverName {
  37. case "mssql":
  38. driveSource := fmt.Sprintf("server=%s;database=%s;user id=%s;password=%s;port=%d;encrypt=disable",
  39. v.Host, v.DbName, v.User, v.Pwd, v.Port)
  40. master, err = xorm.NewEngine("mssql", driveSource)
  41. if err != nil {
  42. fmt.Printf("err1 is %v", err)
  43. return err
  44. }
  45. if err = master.Ping(); err != nil {
  46. return err
  47. }
  48. case "mysql":
  49. driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8",
  50. v.User, v.Pwd, v.Host, v.Port, v.DbName)
  51. master, err = xorm.NewEngine("mysql", driveSource)
  52. if err != nil {
  53. fmt.Printf("err2 is %v", err)
  54. return err
  55. }
  56. if err = master.Ping(); err != nil {
  57. return err
  58. }
  59. }
  60. master.SetTZLocation(utils.TimezoneLocation)
  61. master.SetTZDatabase(utils.TimezoneLocation)
  62. } else if v.Sourcetype == "Slave" {
  63. switch v.DriverName {
  64. case "mssql":
  65. driveSource := fmt.Sprintf("server=%s;database=%s;user id=%s;password=%s;port=%d;encrypt=disable",
  66. v.Host, v.DbName, v.User, v.Pwd, v.Port)
  67. slave, err := xorm.NewEngine("mssql", driveSource)
  68. if err != nil {
  69. fmt.Printf("err1 is %v", err)
  70. return err
  71. }
  72. if err = slave.Ping(); err != nil {
  73. return err
  74. }
  75. slaves = append(slaves, slave)
  76. case "mysql":
  77. driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8",
  78. v.User, v.Pwd, v.Host, v.Port, v.DbName)
  79. slave, err := xorm.NewEngine("mysql", driveSource)
  80. if err != nil {
  81. fmt.Printf("err2 is %v", err)
  82. return err
  83. }
  84. if err = slave.Ping(); err != nil {
  85. return err
  86. }
  87. slaves = append(slaves, slave)
  88. }
  89. }
  90. }
  91. Eloquent, err = xorm.NewEngineGroup(master, slaves)
  92. if err != nil {
  93. return err
  94. }
  95. Eloquent.ShowSQL(false)
  96. return nil
  97. }
  98. //初始化数据库
  99. func InitTestDb() error {
  100. elock.Lock()
  101. defer elock.Unlock()
  102. //数据库信息
  103. dataDb := FindData()
  104. //从库集合
  105. var err error
  106. var testDB *xorm.Engine
  107. slaves := []*xorm.Engine{}
  108. for _, v := range dataDb {
  109. if v.Sourcetype == "Test" {
  110. switch v.DriverName {
  111. case "mssql":
  112. driveSource := fmt.Sprintf("server=%s;database=%s;user id=%s;password=%s;port=%d;encrypt=disable",
  113. v.Host, v.DbName, v.User, v.Pwd, v.Port)
  114. testDB, err = xorm.NewEngine("mssql", driveSource)
  115. if err != nil {
  116. fmt.Printf("err1 is %v", err)
  117. return err
  118. }
  119. if err = testDB.Ping(); err != nil {
  120. return err
  121. }
  122. case "mysql":
  123. driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8",
  124. v.User, v.Pwd, v.Host, v.Port, v.DbName)
  125. testDB, err = xorm.NewEngine("mysql", driveSource)
  126. if err != nil {
  127. fmt.Printf("err2 is %v", err)
  128. return err
  129. }
  130. if err = testDB.Ping(); err != nil {
  131. return err
  132. }
  133. }
  134. }
  135. }
  136. if testDB == nil {
  137. return errors.New("has no test db")
  138. }
  139. Eloquent, err = xorm.NewEngineGroup(testDB, slaves)
  140. if err != nil {
  141. return err
  142. }
  143. //Eloquent.ShowSQL(true)
  144. return nil
  145. }
  146. //创建mongoDb数据库链接
  147. func MgoDb() *mongo.Client {
  148. //判断mgoDb是否存在
  149. if mgoDb != nil {
  150. return mgoDb
  151. }
  152. //创建之前会涉及并发,所以要加锁
  153. mlock.Lock()
  154. defer mlock.Unlock()
  155. //细节,防止多个请求锁住
  156. if mgoDb != nil {
  157. return mgoDb
  158. }
  159. //1.建立链接
  160. ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
  161. client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
  162. if err != nil {
  163. log.Fatal("dbhelper.MgoDb error= ", err)
  164. return nil
  165. } else {
  166. mgoDb = client
  167. return mgoDb
  168. }
  169. }
  170. //数据库
  171. type Database struct {
  172. ID string `bson:"id" json:"database-id"` //ID:uuid唯一字符串
  173. DbName string `bson:"dbname" json:"database-dbname"` //数据库名称
  174. DriverName string `bson:"drivername" json:"database-drivername"` //引擎类型
  175. Host string `bson:"host" json:"database-host"` //链接地址
  176. Port int `bson:"port" json:"database-port"` //端口号
  177. User string `bson:"user" json:"database-user"` //用户名
  178. Pwd string `bson:"pwd" json:"database-pwd"` //密码
  179. Sourcetype string `bson:"sourcetype" json:"database-sourcetype"` //主库和从库
  180. }
  181. func FindData() []*Database {
  182. limit := int64(500)
  183. skip := int64(0)
  184. //1.初始化链接
  185. client := MgoDb()
  186. //2.选择数据库,数据表
  187. collect := client.Database(conf.DbConfig.Mongdbname).Collection("database")
  188. //var skip int64 = 0//从那个开始
  189. //var limit int64 = 2//炼制几个输出字段
  190. cursor, err := collect.Find(context.TODO(), bson.D{}, &options.FindOptions{
  191. Skip: &skip,
  192. Limit: &limit,
  193. Sort: bson.D{{"id", -1}},
  194. })
  195. fmt.Println(cursor)
  196. if err != nil {
  197. return nil
  198. }
  199. defer cursor.Close(context.TODO())
  200. //创建需要反序列化成什么样子的结构体对象
  201. records := make([]*Database, 0)
  202. for cursor.Next(context.TODO()) {
  203. record := &Database{}
  204. //反序列化
  205. err = cursor.Decode(record)
  206. if err != nil {
  207. fmt.Println(err)
  208. return nil
  209. }
  210. //追加
  211. records = append(records, record)
  212. }
  213. return records
  214. }