var jsonData map[string]interface{}//全局变量:存放配置文件的map对象
func initJSON() {
bytes, err := ioutil.ReadFile("./configuration.json")//读取全局配置文件
if err != nil {
fmt.Println("ReadFile: ", err.Error())
}
configStr := string(bytes[:])
reg := regexp.MustCompile(`/\*.*\*/`)
configStr = reg.ReplaceAllString(configStr, "")
bytes = []byte(configStr)
if err := json.Unmarshal(bytes, &jsonData); err != nil {//将读取到的字节解析成map对象
fmt.Println("invalid config: ", err.Error())
}
fmt.Println("Success to ",jsonData["database"])
}
type dBConfig struct {
Dialect string
Database string
User string
Password string
Charset string
Host string
Port int
SQLLog bool
URL string
MaxIdleConns int
MaxOpenConns int
}
// 1.DBConfig 数据库相关配置
var DBConfig dBConfig
func initDB() {
utils.SetStructByJSON(&DBConfig, jsonData["database"].(map[string]interface{}))//将database json对象赋值给dbconfig结构体
portStr := fmt.Sprintf("%d", DBConfig.Port)
url := "{user}:{password}@tcp({host}:{port})/{database}?charset={charset}&parseTime=True&loc=Local"//定义一个url
url = strings.Replace(url, "{database}", DBConfig.Database, -1)//n<0替换所有匹配的,将dbconfig中的对象替换带该url中
url = strings.Replace(url, "{user}", DBConfig.User, -1)
url = strings.Replace(url, "{password}", DBConfig.Password, -1)
url = strings.Replace(url, "{host}", DBConfig.Host, -1)
url = strings.Replace(url, "{port}", portStr, -1)
url = strings.Replace(url, "{charset}", DBConfig.Charset, -1)
fmt.Println(url)
DBConfig.URL = url//再将url返回进该配置文件
}
func init() {//在此处进行初始化
initJSON()
initDB()
}
func init() {
db, err := gorm.Open(config.DBConfig.Dialect, config.DBConfig.URL)
if err!=nil{
fmt.Println(err.Error())
os.Exit(-1)
}
if config.DBConfig.SQLLog {
db.LogMode(true)
}
db.DB().SetMaxIdleConns(config.DBConfig.MaxIdleConns)
db.DB().SetMaxOpenConns(config.DBConfig.MaxOpenConns)
model.DB=db
}
3 . 简单查询
func main() {
var cart model.Cart
model.DB.Where("id=?", 7).First(&cart)
fmt.Println("openid=",cart.OpenId)
}
可以在具体的controller层或者service层进行查询操作
也可以将dao层操作封装到具体方法内
func Get(id uint) Cart{//public方法大写
var cart Cart
DB.Where("id=?", id).First(&cart)
return cart
}
然后在main中调用
func main() {
//var cart =&model.Cart{ID:7} //可以封装成查询cond对象
//model.DB.Where(cart).First(cart)
get := model.Get(7)
fmt.Println("openid=",cart.OpenId)
}
但是这样有个问题,由于go中没有对象调方法的概念,这里不存在Dao对象,无法显性的表示是哪个Dao执行Get方法,而是直接通过包名(model)+公开方法(Get),所有貌似封装也没什么意义