一、前提
1、目前,gorm的官網(https://jasperxu.github.io/gorm-zh/database.html#dbc)支持的數據庫分別是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
}