gorm 数据库初始化

一、前提

1、目前,gorm的官网支持的数据库分别是mysql,postgresql等(其它数据库暂时不做出封装)。

2、在实际运用场所中,数据库的使用有时需要变动,这是为了代码更好的迁移,我们采用config.json配置文件形式存储数据库连接的信息。

二、封装连接

1、配置文件内容

{"database": {
  "name" : "数据库名称",
  "password" : "数据库密码",
  "user" : "数据库用户",
  "type" : "使用的数据库类型",
  "host" : "数据库的host",
  "port" : "端口",
  "table_prefix" : "blog_"
}} //配置文件内容

2、配置文件对应的结构体定义以及初始化配置文件

type Config struct {
   Database           *Database              `json:"database"`
}
var GlobalConfigSetting = &Config{}
func Setup() {
   filePtr, err := os.Open("config/config.json") //config的文件目录
   if err != nil {
      fmt.Println("Open file failed [Err:%s]", err.Error())
      return
   }
   defer filePtr.Close()
   // 创建json解码器
   decoder := json.NewDecoder(filePtr)
   err = decoder.Decode(GlobalConfigSetting)
   DatabaseSetting = GlobalConfigSetting.Database
}
type Database struct {
   Type        string `json:"type"`
   User        string `json:"user"`
   Password    string `json:"password"`
   Host        string `json:"host"`
   Port        string `json:"port"`
   Name        string `json:"name"`
   TablePrefix string `json:"table_prefix"`
}
var DatabaseSetting = &Database{}

3、建立连接

var db *gorm.DB
func NewConnection() *gorm.DB {
   var dbUri string
   if settings.DatabaseSetting.Type == "mysql" {
      dbUri = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true",
         settings.DatabaseSetting.User,
         settings.DatabaseSetting.Password,
         settings.DatabaseSetting.Host,
         settings.DatabaseSetting.Port,
         settings.DatabaseSetting.Name)
   } else if settings.DatabaseSetting.Type == "postgres" {
      dbUri = fmt.Sprintf("host=%s port=%s user=%s dbname=%s sslmode=disable password=%s",
         settings.DatabaseSetting.Host,
         settings.DatabaseSetting.Port,
         settings.DatabaseSetting.User,
         settings.DatabaseSetting.Name,
         settings.DatabaseSetting.Password)
   } else {
      dbUri = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true",
         settings.DatabaseSetting.User,
         settings.DatabaseSetting.Password,
         settings.DatabaseSetting.Host,
         settings.DatabaseSetting.Port,
         settings.DatabaseSetting.Name)
   }

   conn, err := gorm.Open(settings.DatabaseSetting.Type, dbUri)
   if err != nil {
      log.Print(err.Error())
   }
   return conn
}

4、数据库连接池的设置

func Setup() {
   db = NewConnection()
   db.DB().SetMaxIdleConns(10)                   //最大空闲连接数
   db.DB().SetMaxOpenConns(30)                   //最大连接数
   db.DB().SetConnMaxLifetime(time.Second * 300) //设置连接空闲超时
   //db.LogMode(true)
}

5、提供公共方法获取db对象

func GetDB() *gorm.DB {
   if err := db.DB().Ping(); err != nil {
      db.Close()
      db = NewConnection()
   }
   return db
}
posted @ 2020-09-03 09:32  Charlie-frankfud  阅读(4765)  评论(0)    收藏  举报