“ 经过前面的学习,我们对golang的基本语法都有所了解了。今天开始我们学习下,我们可以用golang干什么。”
01
—
准备工作
go get github.com/denisenkom/go-mssqldb
下载完成后,我们就可以用这个包来连接数据库了。首先在main包下新建service包,然后新建一个sqlService的go文件。
var instance *sql.DB
func openSql() (*sql.DB, error) {
var err error
if instance == nil {
connString := fmt.Sprintf("server=%s;database=%s;user id=%s;password=%s;port=%s;encrypt=disable",
config.DataSource,
config.InitialCatalog,
config.UserId,
config.Password,
config.Port)
instance, err = sql.Open("mssql", connString)
}
return instance, err
}
我为了方便,把有关数据库的配置都放在config包下了。这里我们用到了单例模式,每次通过openSql()来连接数据库。
02
—
执行sql
// 无参SQL执行
func ExecSqlNoParam(sqlSentence string) []map[string]interface{} {
db, err := openSql()
if err != nil{
panic(err.Error())
return nil
}
rows, err := db.Query(sqlSentence)
defer rows.Close()
if err != nil{
panic(err.Error())
return nil
}
return getSqlResults(rows)
}
// 有参SQL执行,参数可以为多个
func ExecSqlWithParam(sql string, params ... interface{}) []map[string]interface{}{
db, err := openSql()
if err != nil{
panic(err.Error())
return nil
}
for range params{
sql = sql + " ?,"
}
// 去除最后一个逗号
sql = util.TrimLastChar(sql)
rows, err := db.Query(sql, params...)
defer rows.Close()
if err != nil{
panic(err.Error())
return nil
}
return getSqlResults(rows)
}
// 获取数据库结果,并写入map数组
func getSqlResults(rows *sql.Rows) []map[string]interface{} {
colTypes, cne := rows.ColumnTypes()
if cne != nil {
panic(cne.Error())
return nil
}
results := make([]map[string]interface{}, 0)
for rows.Next(){
values := make([]interface{}, len(colTypes))
result := make(map[string]interface{})
for i := range values{
values[i] = new(interface{})
}
scannerErr := rows.Scan(values...)
if scannerErr != nil{
panic(scannerErr.Error())
return nil
}
for i, colType := range colTypes{
v := reflect.ValueOf(values[i]).Elem().Interface()
// 这里我将null值转成空字符串了,没有此部分需要可以删除
if v == nil{
v = ""
}
result[colType.Name()] = v
}
results = append(results, result)
}
return results
}
func main() {
results := service.ExecSqlNoParam("Select * from TABLE_TEST")
for i := range results{
fmt.Println(results[i])
}
}
如果需要完整源码,可以私信我获取。