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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

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

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

golang本身沒(méi)有提供連接mysql的驅(qū)動(dòng),但是定義了標(biāo)準(zhǔn)接口供第三方開發(fā)驅(qū)動(dòng)。這里連接mysql可以使用第三方庫(kù),第三方庫(kù)推薦使用https://github.com/Go-SQL-Driver/MySQL這個(gè)驅(qū)動(dòng),更新維護(hù)都比較好。下面演示下具體的使用,完整代碼示例可以參考最后。

下載驅(qū)動(dòng)

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)境進(jìn)行替換。

創(chuàng)建測(cè)試表

在mysql test庫(kù)中創(chuàng)建測(cè)試表

CREATE TABLE IF NOT EXISTS `test`.`user` (`user_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用戶編號(hào)',`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 = '用戶表'

數(shù)據(jù)庫(kù)連接

數(shù)據(jù)庫(kù)連接使用datebase/sql Open函數(shù)進(jìn)行連接

1db, 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

通常我們都用第二種。

插入操作

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)

這里使用結(jié)構(gòu)化操作,不推薦使用直接拼接sql語(yǔ)句的方法。

查詢操作

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個(gè)獨(dú)立變量userId、userName、userAge、userSex來(lái)保存查詢出來(lái)的每一行的值。在實(shí)際開發(fā)中通常會(huì)封裝數(shù)據(jù)庫(kù)的操作,對(duì)這樣的查詢通常會(huì)考慮返回字典類型。

12345678910111213141516171819//構(gòu)造scanArgs、values兩個(gè)數(shù)組,scanArgs的每個(gè)值指向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)}

修改操作

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)

修改和刪除操作都比較簡(jiǎn)單,同插入數(shù)據(jù)類似,只是使用RowsAffected來(lái)獲取影響的數(shù)據(jù)行數(shù)。

完整代碼

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)????//}????//字典類型????//構(gòu)造scanArgs、values兩個(gè)數(shù)組,scanArgs的每個(gè)值指向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)????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é)

整體上來(lái)說(shuō)都比較簡(jiǎn)單,就是查詢那邊使用字典來(lái)存儲(chǔ)返回?cái)?shù)據(jù)比較復(fù)雜一些。既然說(shuō)到數(shù)據(jù)庫(kù)連接,通常應(yīng)用中都會(huì)使用連接池來(lái)減少連接開銷,關(guān)于連接池下次整理一下再放上來(lái)。


來(lái)源:http://www.01happy.com/golang-mysql-demo/

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。