国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

golang連接mysql數(shù)據(jù)庫實現(xiàn)增刪改查

2024-07-24 12:35:03
字體:
供稿:網(wǎng)友
  下面看一篇關(guān)于golang連接mysql數(shù)據(jù)庫實現(xiàn)增刪改查數(shù)據(jù)的例子,希望本文章能幫助到了解golang與mysql數(shù)據(jù)庫之間關(guān)系了.
 
  golang本身沒有提供連接mysql的驅(qū)動,但是定義了標準接口供第三方開發(fā)驅(qū)動,這里連接mysql可以使用第三方庫,第三方庫推薦使用https://github.com/Go-SQL-Driver/MySQL這個驅(qū)動,更新維護都比較好,下面演示下具體的使用,完整代碼示例可以參考最后.
 
  下載驅(qū)動:sudo go get github.com/go-sql-driver/mysql
 
  如果提示這樣的失敗信息:cannot download, $GOPATH not set. For more details see: go help gopath,可以使用如下命令解決.
 
  sudo env GOPATH=/Users/chenjiebin/golang go get github.com/go-sql-driver/mysql
 
  GOPATH的值根據(jù)自行環(huán)境進行替換.
 
  創(chuàng)建測試表,在mysql test庫中創(chuàng)建測試表,代碼如下:
 
  CREATE TABLE IF NOT EXISTS `test`.`user` (
   `user_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用戶編號',
   `user_name` VARCHAR(45) NOT NULL COMMENT '用戶名稱',
   `user_age` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用戶年齡',
   `user_sex` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用戶性別',  --phpfensi.com
   PRIMARY KEY (`user_id`))
   ENGINE = InnoDB
   AUTO_INCREMENT = 1
   DEFAULT CHARACTER SET = utf8
   COLLATE = utf8_general_ci
   COMMENT = '用戶表'
  數(shù)據(jù)庫連接,數(shù)據(jù)庫連接使用datebase/sql Open函數(shù)進行連接,代碼如下:
 
  db,err := sql.Open("mysql", "user:password@tcp(localhost:5555)/dbname?charset=utf8")
 
  其中連接參數(shù)可以有如下幾種形式:
 
  user@unix(/path/to/socket)/dbname?charset=utf8
  user:password@tcp(localhost:5555)/dbname?charset=utf8
  user:password@/dbname
  user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname
  通常我們都用第二種.
 
  插入操作,代碼如下:
 
  stmt, err := db.Prepare(`INSERT user (user_name,user_age,user_sex) values (?,?,?)`)
  checkErr(err)
  res, err := stmt.Exec("tony", 20, 1)
  checkErr(err)
  id, err := res.LastInsertId()
  checkErr(err)
  fmt.Println(id)
  這里使用結(jié)構(gòu)化操作,不推薦使用直接拼接sql語句的方法.
 
  查詢操作,代碼如下:
 
  rows, err := db.Query("SELECT * FROM user")
  checkErr(err)
  
  for rows.Next() {
      var userId int
      var userName string
      var userAge int
      var userSex int
      rows.Columns()
      err = rows.Scan(&userId, &userName, &userAge, &userSex)
      checkErr(err)
      fmt.Println(userId)
      fmt.Println(userName)
      fmt.Println(userAge)
      fmt.Println(userSex)
  }
  這里查詢的方式使用聲明4個獨立變量userId、userName、userAge、userSex來保存查詢出來的每一行的值,在實際開發(fā)中通常會封裝數(shù)據(jù)庫的操作,對這樣的查詢通常會考慮返回字典類型,代碼如下:
 
  //構(gòu)造scanArgs、values兩個數(shù)組,scanArgs的每個值指向values相應(yīng)值的地址
  columns, _ := rows.Columns()
  scanArgs := make([]interface{}, len(columns))
  values := make([]interface{}, len(columns))
  for i := range values {
      scanArgs[i] = &values[i]
  }
  
  for rows.Next() {
      //將行數(shù)據(jù)保存到record字典
      err = rows.Scan(scanArgs...)
      record := make(map[string]string)
      for i, col := range values {
          if col != nil {
              record[columns[i]] = string(col.([]byte))
          }
      }
      fmt.Println(record)
  }
  修改操作:
 
  stmt, err := db.Prepare(`UPDATE user SET user_age=?,user_sex=? WHERE user_id=?`)
  checkErr(err)
  res, err := stmt.Exec(21, 2, 1)
  checkErr(err)
  num, err := res.RowsAffected()
  checkErr(err)
  fmt.Println(num)
  刪除操作:
 
  stmt, err := db.Prepare(`DELETE FROM user WHERE user_id=?`)
  checkErr(err)
  res, err := stmt.Exec(1)
  checkErr(err)
  num, err := res.RowsAffected()
  checkErr(err)
  fmt.Println(num)
  修改和刪除操作都比較簡單,同插入數(shù)據(jù)類似,只是使用RowsAffected來獲取影響的數(shù)據(jù)行數(shù),完整代碼如下:
 
  package main
  
  import (
      "database/sql"
      "fmt"
      _ "github.com/go-sql-driver/mysql"
  )
  
  func main() {
      insert()
  }
  
  //插入demo
  func insert() {
      db, err := sql.Open("mysql", "root:@/test?charset=utf8")
      checkErr(err)
  
      stmt, err := db.Prepare(`INSERT user (user_name,user_age,user_sex) values (?,?,?)`)
      checkErr(err)
      res, err := stmt.Exec("tony", 20, 1)
      checkErr(err)
      id, err := res.LastInsertId()
      checkErr(err)
      fmt.Println(id)
  }
  
  //查詢demo
  func query() {
      db, err := sql.Open("mysql", "root:@/test?charset=utf8")
      checkErr(err)
  
      rows, err := db.Query("SELECT * FROM user")
      checkErr(err)
  
      //普通demo
      //for rows.Next() {
      //    var userId int
      //    var userName string
      //    var userAge int
      //    var userSex int
  
      //    rows.Columns()
      //    err = rows.Scan(&userId, &userName, &userAge, &userSex)
      //    checkErr(err)
  
      //    fmt.Println(userId)
      //    fmt.Println(userName)
      //    fmt.Println(userAge)
      //    fmt.Println(userSex)
      //}
  
      //字典類型
      //構(gòu)造scanArgs、values兩個數(shù)組,scanArgs的每個值指向values相應(yīng)值的地址
      columns, _ := rows.Columns()
      scanArgs := make([]interface{}, len(columns))
      values := make([]interface{}, len(columns))
      for i := range values {
          scanArgs[i] = &values[i]
      }
  
      for rows.Next() {
          //將行數(shù)據(jù)保存到record字典
          err = rows.Scan(scanArgs...)
          record := make(map[string]string)
          for i, col := range values {
              if col != nil {
                  record[columns[i]] = string(col.([]byte))
              }
          }
          fmt.Println(record)
      }
  }
  
  //更新數(shù)據(jù)
  func update() {
      db, err := sql.Open("mysql", "root:@/test?charset=utf8")
      checkErr(err)
  
      stmt, err := db.Prepare(`UPDATE user SET user_age=?,user_sex=? WHERE user_id=?`)
      checkErr(err)
      res, err := stmt.Exec(21, 2, 1)
      checkErr(err)
      num, err := res.RowsAffected()
      checkErr(err)
      fmt.Println(num)
  }
  
  //刪除數(shù)據(jù)
  func remove() {
      db, err := sql.Open("mysql", "root:@/test?charset=utf8")
      checkErr(err)
  
      stmt, err := db.Prepare(`DELETE FROM user WHERE user_id=?`)
      checkErr(err)  //phpfensi.com
      res, err := stmt.Exec(1)
      checkErr(err)
      num, err := res.RowsAffected()
      checkErr(err)
      fmt.Println(num)
  }
  
  func checkErr(err error) {
      if err != nil {
          panic(err)
      }
  }
  小結(jié):整體上來說都比較簡單,就是查詢那邊使用字典來存儲返回數(shù)據(jù)比較復(fù)雜一些,既然說到數(shù)據(jù)庫連接,通常應(yīng)用中都會使用連接池來減少連接開銷,關(guān)于連接池下次整理一下再放上來.
 
 

(編輯:武林網(wǎng))

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 青州市| 南丰县| 神农架林区| 固镇县| 海丰县| 巴林左旗| 英山县| 雷山县| 湘潭市| 新干县| 南丰县| 柘城县| 万源市| 长海县| 沛县| 广河县| 高邮市| 孝义市| 肃南| 禹城市| 如皋市| 宜良县| 伊吾县| 通化市| 永嘉县| 博爱县| 南投市| 邯郸市| 手机| 沙田区| 子长县| 汉川市| 福泉市| 湘西| 宜丰县| 台江县| 盐池县| 西峡县| 龙游县| 贡嘎县| 乌兰浩特市|