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

歡迎訪問 生活随笔!

生活随笔

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

数据库

go语言代码连接mysql_【mysql】golang连接mysql操作示例增删改查

發布時間:2023/12/10 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go语言代码连接mysql_【mysql】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 = InnoDB

AUTO_INCREMENT = 1

DEFAULT CHARACTER SET = utf8

COLLATE = utf8_general_ci

COMMENT = '用戶表'

數據庫連接

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

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

通常我們都用第二種。

插入操作

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)

這里使用結構化操作,不推薦使用直接拼接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來保存查詢出來的每一行的值。在實際開發中通常會封裝數據庫的操作,對這樣的查詢通常會考慮返回字典類型。

//構造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)

}

修改操作

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)

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

完整代碼

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)

//}

//字典類型

//構造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)

}

}

小結

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

參考資料:《go web編程》,go web編程中對數據庫連接做了比較詳細的解說,值得一看。

總結

以上是生活随笔為你收集整理的go语言代码连接mysql_【mysql】golang连接mysql操作示例增删改查的全部內容,希望文章能夠幫你解決所遇到的問題。

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