人生苦短,我用 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