人生苦短,我用 Golang--Go 語言操作數據庫
“ 經過前面的學習,我們對 golang 的基本語法都有所瞭解了。今天開始我們學習下,我們可以用 golang 幹什麼。”
日常開發肯定免不了要和數據庫交互,所以操作數據庫是必需的。今天我以 sql server 爲例,來和大家一起學習下 golang 操作數據庫。
01
準備工作
我們首先需要下載 mssql 的包,獲取包的命令爲
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 語句了,這裏我封裝了兩個方法,分別用於執行有參和無參的 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
}
上面的代碼可能稍微有些複雜,不過慢慢理解下應該就可以了,執行 SQL 後,通過我封裝的 getSqlResults(rows *sql.Rows) , 將數據庫結果寫入到一個 map 數據中,這樣我們就可以在外部訪問數據集了。
那現在就讓我們開始執行一段 sql 來試試吧
func main() {
results := service.ExecSqlNoParam("Select * from TABLE_TEST")
for i := range results{
fmt.Println(results[i])
}
}
如果需要完整源碼,可以私信我獲取。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/KiQlajc3-5i3OlMXkgH7Sg