日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

golang连接mysql操作示例增删改查(已经测试)

發布時間:2024/9/20 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang连接mysql操作示例增删改查(已经测试) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

golang本身沒有提供連接mysql的驅動,但是定義了標準接口供第三方開發驅動。這里連接mysql可以使用第三方庫,第三方庫推薦使用https://github.com/Go-SQL-Driver/MySQL這個驅動,更新維護都比較好。下面演示下具體的使用,完整代碼示例可以參考最后。

下載驅動

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的值根據自行環境進行替換。

創建測試表

在mysql test庫中創建測試表

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 '用戶性別',PRIMARY KEY (`user_id`))ENGINE = InnoDBAUTO_INCREMENT = 1DEFAULT CHARACTER SET = utf8COLLATE = utf8_general_ciCOMMENT = '用戶表'

數據庫連接

數據庫連接使用datebase/sql Open函數進行連接

1db, err := sql.Open("mysql",?"user:password@tcp(localhost:5555)/dbname?charset=utf8")

其中連接參數可以有如下幾種形式:

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

通常我們都用第二種。

插入操作

1234567stmt, 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)

這里使用結構化操作,不推薦使用直接拼接sql語句的方法。

查詢操作

12345678910111213141516rows, 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來保存查詢出來的每一行的值。在實際開發中通常會封裝數據庫的操作,對這樣的查詢通常會考慮返回字典類型。

12345678910111213141516171819//構造scanArgs、values兩個數組,scanArgs的每個值指向values相應值的地址columns, _ := rows.Columns()scanArgs := make([]interface{}, len(columns))values := make([]interface{}, len(columns))for i :=?range values {????scanArgs[i] = &values[i]}for rows.Next() {????//將行數據保存到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)}

修改操作

1234567stmt, 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)

刪除操作

1234567stmt, 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)

修改和刪除操作都比較簡單,同插入數據類似,只是使用RowsAffected來獲取影響的數據行數。

完整代碼

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106package mainimport (????"database/sql"????"fmt"????_?"github.com/go-sql-driver/mysql")func main() {????insert()}//插入demofunc 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)}//查詢demofunc 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)????//}????//字典類型????//構造scanArgs、values兩個數組,scanArgs的每個值指向values相應值的地址????columns, _ := rows.Columns()????scanArgs := make([]interface{}, len(columns))????values := make([]interface{}, len(columns))????for i :=?range values {????????scanArgs[i] = &values[i]????}????for rows.Next() {????????//將行數據保存到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)????}}//更新數據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)}//刪除數據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)????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)????}}

小結

整體上來說都比較簡單,就是查詢那邊使用字典來存儲返回數據比較復雜一些。既然說到數據庫連接,通常應用中都會使用連接池來減少連接開銷,關于連接池下次整理一下再放上來。


來源:http://www.01happy.com/golang-mysql-demo/

總結

以上是生活随笔為你收集整理的golang连接mysql操作示例增删改查(已经测试)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。