2020-08-10

GO语言连接数据库操作

设置配置及读取数据库信息

2020-08-10_第1张图片
创建配置信息读取类

package conf

import (
	"os"

	"github.com/larspensjo/config"
)

var Conf, UrlConf *config.Config

func BuildConfig() {
     
	conf, err := config.ReadDefault("config/app.conf") //将配置文件加载到Conf对象中
	if err != nil {
     
		os.Exit(1)
	}
	Conf = conf
}

func init() {
     
	BuildConfig()
	return
}

初始化数据库连接对象

package DB

import (
	"TestWeb/config"
	"TestWeb/recordlog"
	"database/sql" //GO语言自带的数据库依赖
	"fmt"

	_ "github.com/denisenkom/go-mssqldb" //使用_代表执行这个包的init函数 用于初始化函数  sqlServer数据库驱动包
)

//创建数据库连接信息对象
type Deinfo struct {
     
	IP     string
	Port   string
	User   string
	Pwd    string
	DbName string
}

type DBLStruct struct {
     
	DB *sql.DB
}


//声明数据参数载体
var (
	DB     *sql.DB //声明数据连接对象
	DbPort string
	DbHost string
	DbUser string
	DbName string
	DbPwd  string
	DbPool int                   //数据库连接池
	DBLink map[string]*DBLStruct = map[string]*DBLStruct{
     }
)
//init方法 自动执行
func init() {
     

	dbinit()
}

func dbinit() error {
     
	var err error
	recordlog.Debug("============开始初始话数据库=================")
	conf_String := func(section string, option string) (string, error) {
     
		if err != nil {
     
			return "", err
		}
		return conf.Conf.String(section, option) //获取配置文件信息
	}
	DbHost, err = conf_String("DB", "DbHost")
	DbPort, err = conf_String("DB", "DbPort")
	DbName, err = conf_String("DB", "DbName")
	DbUser, err = conf_String("DB", "DbUser")
	DbPwd, err = conf_String("DB", "DbPassword")
	recordlog.Debug("数据库连接信息:", DbHost, ":", DbPort)
	DbPool, err = conf.Conf.Int("DB", "DbPool") //获取数据连接池容量

	if err != nil {
      //错误本身没有意义
		recordlog.Debug("Initialize DB config error:", err)
	}

	dbUrl := fmt.Sprintf("server=%s;port=%s;database=%s;user id=%s;password=%s", DbHost, DbPort, DbName, DbUser, DbPwd) //拼接数据库连接字符串

	recordlog.Debug("===================", dbUrl, "======================")
	DB, err = sql.Open("mssql", dbUrl) //驱动名称,数据源连接参数  获取数据库对象
	if err != nil {
     
		recordlog.Debug("创建数据库连接对象报错")
		panic(err)
	}
	DB.SetMaxOpenConns(DbPool) /*设置连接池容量*/
	err = DB.Ping()
	if err != nil {
     
		recordlog.Debug("ping DBserver error:", err)
	}
	/**/
	recordlog.Debug("Initialize DB connect OK...")
	return nil
}

数据库执行代码

package DB
import (
	"TestWeb/recordlog"
)
var INSERT_DATA = `INSERT INTO student(sid,sname,age) VALUES(?,?,?);`

/*执行SQL语句insert或update(单数据库版)*/
func ExeSQLIU(query string) error {
     

	recordlog.Debug(query)
	_, err := DB.Exec("INSERT INTO class (id,name) VALUES(?,?);", '1', "老张")
	recordlog.Debug(err)
	recordlog.Debug("数据库操作中")

	return nil
}

测试代码

package function

import (
	"TestWeb/DB"
	"TestWeb/recordlog"
	"fmt"
	"net/http"

	"github.com/julienschmidt/httprouter"
)

type TestFunc struct{
     }

//创建结构体的指针对象 用于调用下面的方法
var TestFuncObj = new(TestFunc)

/*
 功能那个方法具有固定的格式 func (参数名称 结构体的指针类型) 方法名称(w http.ResponseWriter, r *http.Request, _ httprouter.Params)   参数是固定的
*/

func (this *TestFunc) GetMessage(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
     
	fmt.Println("============打印数据=============")
	CREATE_TABLE := "create table class (id char(4) primary key ,name varchar(50)not null)"
	DB.ExeSQLIU(CREATE_TABLE)
	recordlog.Debug("数据库操作执行完成")
}

踩坑记录

2020/08/10 15:35:57 http: panic serving 127.0.0.1:57916: runtime error: invalid memory address or nil pointer dereference

运行时异常

出现问题的愿意是执行SQL语句时使用Exec来执行,这个方法在执行结束后会返回一个结果集 结果集无需关闭 这里出现异常的原因就是 错误的关闭了结果集

2020-08-10_第2张图片

注意

1.在执行SQL语句时要记得将SQL语句结束后的分号加上

	_, err := DB.Exec("INSERT INTO class (id,name) VALUES(?,?);", '1', "老张")

2020-08-10_第3张图片

2.错误的关闭数据库实例
2020-08-10_第4张图片
在此处关闭数据库实例会意味着 该方法在第一次调用后 将关闭对数据库的连接,之后再操作数据库会发现数据库无法连接

你可能感兴趣的:(GOLang,go)