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来执行,这个方法在执行结束后会返回一个结果集 结果集无需关闭 这里出现异常的原因就是 错误的关闭了结果集
1.在执行SQL语句时要记得将SQL语句结束后的分号加上
_, err := DB.Exec("INSERT INTO class (id,name) VALUES(?,?);", '1', "老张")
2.错误的关闭数据库实例
在此处关闭数据库实例会意味着 该方法在第一次调用后 将关闭对数据库的连接,之后再操作数据库会发现数据库无法连接