mysql.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package mysql
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "gorm.io/driver/mysql"
  6. "gorm.io/gorm"
  7. "gorm.io/gorm/logger"
  8. "gorm.io/plugin/dbresolver"
  9. setting "icloudapp.cn/tools/config"
  10. "icloudapp.cn/tools/service/entity"
  11. "icloudapp.cn/tools/service/model"
  12. )
  13. var DBConn *gorm.DB
  14. func Init(cfg *setting.MySQLConfig) {
  15. dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
  16. cfg.User, cfg.Password, cfg.Host, cfg.DB)
  17. sqlDB, err := sql.Open("mysql", dsn)
  18. if err != nil {
  19. panic(fmt.Sprintf("sql.Open err, \v", err))
  20. }
  21. sqlDB.SetMaxOpenConns(cfg.MaxOpenConns) //最大连接数
  22. sqlDB.SetMaxOpenConns(cfg.MaxIdleConns)
  23. loggerLevel := logger.Silent
  24. if setting.Conf.Mode == "dev" {
  25. loggerLevel = logger.Info
  26. }
  27. gormDB, err := gorm.Open(mysql.New(mysql.Config{
  28. Conn: sqlDB,
  29. }), &gorm.Config{
  30. DisableForeignKeyConstraintWhenMigrating: true, //禁用外键生成
  31. Logger: logger.Default.LogMode(loggerLevel),
  32. })
  33. if err != nil {
  34. panic(fmt.Sprintf("链接数据库失败\v", err))
  35. }
  36. // db resolver
  37. var material *entity.Material
  38. var group *entity.Group
  39. var user *entity.User
  40. errDbresolver := gormDB.Use(dbresolver.Register(dbresolver.Config{
  41. Sources: []gorm.Dialector{open(cfg)},
  42. Replicas: []gorm.Dialector{open(cfg), open(cfg)},
  43. Policy: dbresolver.RandomPolicy{},
  44. TraceResolverMode: true,
  45. }).Register(dbresolver.Config{
  46. Replicas: []gorm.Dialector{open(setting.Conf.ReplicasForUser)},
  47. TraceResolverMode: true,
  48. }, user).Register(dbresolver.Config{
  49. Sources: []gorm.Dialector{open(setting.Conf.ReplicasForOrder), open(setting.Conf.ReplicasForOrder)},
  50. Replicas: []gorm.Dialector{open(setting.Conf.ReplicasForOrder)},
  51. TraceResolverMode: true,
  52. }, group, material))
  53. if err != nil {
  54. panic("dbResolver err :" + errDbresolver.Error())
  55. }
  56. DBConn = gormDB
  57. model.SetDefault(DBConn)
  58. }
  59. func open(cfg *setting.MySQLConfig) gorm.Dialector {
  60. dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
  61. cfg.User, cfg.Password, cfg.Host, cfg.DB)
  62. return mysql.Open(dsn)
  63. }