123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- package db
- import (
- MYSQL "database/sql"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "path"
- "path/filepath"
- "rtzh_elec_temperature/conf"
- "rtzh_elec_temperature/global"
- "rtzh_elec_temperature/logger"
- "rtzh_elec_temperature/tools"
- "strings"
- "github.com/astaxie/beego/orm"
- _ "github.com/go-sql-driver/mysql"
- )
- type DbConfig struct {
- Host string `json:"host"`
- Port string `json:"port"`
- User string `json:"user"`
- Pwd string `json:"pwd"`
- Db string `json:"dbname"`
- Charset string `json:"charset"`
- }
- var DbConfigJSON DbConfig
- //返回一个新的orm对象
- func CreateOrm() orm.Ormer {
- return orm.NewOrm()
- }
- func ConnDB(cnfpath string) (*MYSQL.DB, error) {
- logger.Logger.Println("加载数据库配置文件:" + cnfpath)
- fileHanlder, err := os.Open(cnfpath)
- if err != nil {
- logger.Logger.Error(fmt.Sprintf(" 配置文件%s加载失败:%s\r", cnfpath, err))
- os.Exit(1)
- }
- txt, _ := ioutil.ReadAll(fileHanlder)
- fileHanlder.Close()
- txtStr := strings.Trim(string(txt), " ")
- if txtStr == "" {
- logger.Logger.Error("数据库配置文件内容为空,请正确配置")
- os.Exit(1)
- }
- logger.Logger.Debug(txtStr)
- if txtStr[0:1] != "[" {
- txtStr = "[" + txtStr + "]"
- }
- cfgdata := []DbConfig{}
- err = json.Unmarshal([]byte(txtStr), &cfgdata)
- if err != nil {
- logger.Logger.Error("配置文件解析失败:" + err.Error())
- os.Exit(1)
- }
- var conn *MYSQL.DB
- for i, cfgItem := range cfgdata {
- if cfgItem.Port == "" {
- cfgItem.Port = "3306"
- }
- if cfgItem.Charset == "" {
- cfgItem.Charset = "utf8"
- }
- //urll:=root:11111111@tcp(127.0.0.1:3306)/mytest?charset=utf8
- url := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", cfgItem.User, cfgItem.Pwd, cfgItem.Host, cfgItem.Port, cfgItem.Db, cfgItem.Charset)
- conn, err := MYSQL.Open("mysql", url)
- if err != nil {
- return conn, err
- }
- global.MysqlConn = conn
- aliasName := cfgItem.Db
- if i == 0 {
- aliasName = "default" //第一个定义的数据库为默认数据库
- }
- err = orm.RegisterDataBase(aliasName, "mysql", url, 30)
- if err != nil {
- logger.Logger.Error("数据库[" + cfgItem.Db + "]连接失败:" + err.Error())
- os.Exit(0)
- }
- logger.Logger.Println("Mysql数据库[" + cfgItem.Db + "]连接成功")
- if conf.GlobalConfig["loglevel"] == "5" {
- orm.Debug = true
- }
- orm.SetMaxIdleConns(aliasName, 2)
- orm.SetMaxOpenConns(aliasName, 50)
- //测试数据库连接
- sql := "select 1 "
- testdb := orm.NewOrm()
- testdb.Using(aliasName)
- lst := []orm.Params{}
- _, err = testdb.Raw(sql).Values(&lst)
- if err != nil {
- logger.Logger.Println(fmt.Sprintf("数据库%s访问失败", cfgItem.Db))
- logger.Logger.Error(err)
- os.Exit(0)
- }
- if cfgItem.Db == "iss" {
- new(IssDB).Conn(cfgItem)
- }
- }
- //检查默认数据是否初始化
- sql := "select param_value from global_sys_param where param_name=? "
- o := orm.NewOrm()
- o.Using("default")
- datas := []orm.Params{}
- _, dberr := o.Raw(sql, "db_script_version").Values(&datas)
- //CacheMonitorPoint()
- if dberr != nil {
- fileHanlder, err = os.Open("db/db_init.sql")
- if err != nil {
- logger.Logger.Error("数据库初始化脚本文件db/db_init.sql加载失败:" + err.Error())
- return nil, err
- }
- //txt, _ = ioutil.ReadAll(fileHanlder)
- fileHanlder.Close()
- cmd := exec.Command("mysql", "-h"+cfgdata[0].Host, "-P"+cfgdata[0].Port,
- "-u"+cfgdata[0].User, "-p"+cfgdata[0].Pwd, "-D"+cfgdata[0].Db,
- "-e", "source db/db_init.sql")
- err = cmd.Start()
- if err != nil {
- logger.Logger.Error(err)
- }
- cmd.Wait()
- }
- db_script_version := ""
- if len(datas) > 0 {
- db_script_version = tools.IsEmpty(datas[0]["param_value"])
- } else {
- o.Raw("insert into global_sys_param (param_name,param_value,param_memo)values(?,?,?)", "db_script_version", "0", "数据库更新版本").Exec()
- }
- //检查是否有数据库更新脚本
- dbUpdatefile, err2 := ioutil.ReadDir("db")
- if err2 == nil {
- for _, fsitem := range dbUpdatefile {
- fs_n := fsitem.Name()
- filepath.Walk(fs_n, func(fpath string, fi os.FileInfo, err error) error {
- if path.Ext(fpath) == ".sql" && strings.HasPrefix(fpath, "db_update_v") {
- script_v := strings.Replace(fs_n, "db_update_v", "", 1)
- script_v = strings.Trim(strings.Replace(script_v, ".sql", "", 1), " ")
- if db_script_version == "" || script_v > db_script_version {
- fileHanlder, err = os.Open("db/" + fs_n)
- if err != nil {
- logger.Logger.Error("数据库初始化脚本文件db/" + fs_n + "加载失败:" + err.Error())
- return nil
- }
- //txt, _ = ioutil.ReadAll(fileHanlder)
- fileHanlder.Close()
- cmd := exec.Command("mysql", "-h"+cfgdata[0].Host, "-P"+cfgdata[0].Port,
- "-u"+cfgdata[0].User, "-p"+cfgdata[0].Pwd, "-D"+cfgdata[0].Db,
- "-e", "source db/"+fs_n)
- err = cmd.Start()
- if err != nil {
- logger.Logger.Error(err)
- } else {
- o.Raw("update global_sys_param set param_value=? where param_name=?", script_v, "db_script_version").Exec()
- }
- cmd.Wait()
- }
- }
- return nil
- })
- }
- } else {
- logger.Logger.Error(err2)
- }
- DbConfigJSON = cfgdata[0]
- return conn, nil
- }
- func CloseDB() {
- if global.MysqlConn != nil {
- global.MysqlConn.Close()
- }
- }
- func CheckErr(err error) {
- if err != nil {
- fmt.Println(tools.NowTime() + ":" + err.Error())
- panic(err)
- }
- }
- //测试数据库切换
- func DbSwitchTest() {
- db1 := orm.NewOrm() //操作默认数据库
- tmplst1 := []orm.Params{}
- db1.Raw("select * from global_sys_param").Values(&tmplst1)
- fmt.Println(tmplst1)
- err := db1.Using("gzpd1") //切换到其他数据库
- if err != nil {
- logger.Logger.Println(err.Error())
- } else {
- tmplst2 := []orm.Params{}
- db1.Raw("select * from global_sys_param").Values(&tmplst2)
- fmt.Println(tmplst2)
- }
- db1.Using("default") //切换到默认数据库
- db1.Raw("select * from global_const_code").Values(&tmplst1)
- fmt.Println(tmplst1)
- }
|