Go·使用MySQL操作增删查改
注意为了数据库连接 不拥塞导致服务502 建议做返回值模式
注意://Scan 大坑 需要与字段与存储变量一一对应,其中 必须先初始化 结构体,数据库字段中必须不能为null
一、设置环境(必须)
#//设置环境变量(必须) #1.开启代理设置 终端运行 go env -w GO111MODULE=on #2.设置代理源 终端运行 go env -w GOPROXY=https://goproxy.cn,direct #3.生成go.mod文件 终端运行 (test换成为项目文件名) go mod init test #4.引入包 终端运行 go get github.com/go-sql-driver/mysql #5.引入包 终端运行 go get github.com/jmoiron/sqlx #6.完结关闭.go文件再打开
二、代码设计
package main // Golang 操作MySQL //linwute in 2022-08-08 //终端 运行(开启VPN国内镜像 根据需要) go env -w GOPROXY=https://goproxy.cn,direct //终端 运行 go get github.com/go-sql-driver/mysql //终端 运行 go get github.com/jmoiron/sqlx //如果以上执行无效则执行下面 //终端 运行 go get -u github.com/go-sql-driver/mysql //终端 运行 go get -u github.com/jmoiron/sqlx //操作包 import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) var ( //全局变量 数据库账号 userName string = "abc" password string = "abc" ipAddrees string = "127.0.0.1" port int = 3306 dbName string = "test" charset string = "utf8" ) //链接数据库 func connectMysql() *sqlx.DB { dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, password, ipAddrees, port, dbName, charset) Db, err := sqlx.Open("mysql", dsn) if err != nil { //异常打印 fmt.Printf("mysql connect failed (异常), detail is [%v]", err.Error()) } return Db } //插入数据库 func addRecord(Db *sqlx.DB) { // userinfo 为数据库表名 for i := 0; i < 2; i++ { result, err := Db.Exec("insert into userinfo values(?,?,?,?,?,?)", 0, "2019-07-06 11:45:20", "johny", "123456", "技术部", "123456@163.com") if err != nil { //异常打印 fmt.Printf("data insert faied, error:[%v]", err.Error()) return } id, _ := result.LastInsertId() fmt.Printf("insert success, last id:[%d]\n", id) Db.Close() //关闭数据库 //必须关闭Db.Close关闭数据库 否则并发连接池过大,请求超50次会导致数据库宕机404或502 } } //更新数据 func updateRecord(Db *sqlx.DB) { //更新uid=1的username result, err := Db.Exec("update userinfo set username = 'anson' where uid = 1") if err != nil { //异常打印 fmt.Printf("update faied, error:[%v]", err.Error()) return } num, _ := result.RowsAffected() fmt.Printf("update success, affected rows:[%d]\n", num) Db.Close() //关闭数据库 //必须关闭Db.Close关闭数据库 否则并发连接池过大,请求超50次会导致数据库宕机404或502 } //删除数据 func deleteRecord(Db *sqlx.DB) { //删除uid=2的数据 result, err := Db.Exec("delete from userinfo where uid = 2") if err != nil { //异常打印 fmt.Printf("delete faied, error:[%v]", err.Error()) return } num, _ := result.RowsAffected() fmt.Printf("delete success, affected rows:[%d]\n", num) Db.Close() //关闭数据库 //必须关闭Db.Close关闭数据库 否则并发连接池过大,请求超50次会导致数据库宕机404或502 } //查询数据单条 fun querOne(Db *sqlx.DB, id string, sum string){ var sqls string = "select * from id where `id` = '123455'" var Db = sql.ConnectMysql().DB //链接数据库 //defer Db.Close() //延迟关闭数据库 rows := Db.QueryRow(sqls) //执行查询单条 rows.Scan( //大坑 需要与字段与存储变量一一对应 &id, //存储结果 &user, ) Db.Close() //关闭数据库 必须 } // 查询多条数据 func queryData(Db *sqlx.DB, idSchool string, id string, sum string) { rows, _ := Db.Query("SELECT * FROM life_data") //执行查询 for rows.Next() { //定义变量接收查询数据 var intShow, intView int var id, idSchool, userid string //Scan 大坑 需要与字段与存储变量一一对应,其中 必须先初始化 结构体,数据库字段中必须不能为null err := rows.Scan(&id, &idSchool, &userid) if err != nil { //异常处理 fmt.Println("get data failed,异常处理 error:[%v]", err.Error()) } fmt.Println(id, idSchool, userid) //打印 } //关闭结果集(释放连接) rows.Close() Db.Close() //关闭数据库 //必须关闭Db.Close关闭数据库 否则并发连接池过大,请求超50次会导致数据库宕机404或502 } func main() { var Db *sqlx.DB = connectMysql() //链接数据库 defer Db.Close() //延迟关闭数据库 addRecord(Db) //updateRecord(Db) //deleteRecord(Db) }
用例子:
package sql // Golang 操作MySQL //linwute in 2022-08-08 //终端 运行(开启VPN国内镜像 根据需要) go env -w GOPROXY=https://goproxy.cn,direct //终端 运行 go get github.com/go-sql-driver/mysql //终端 运行 go get github.com/jmoiron/sqlx //如果以上执行无效则执行下面 //终端 运行 go get -u github.com/go-sql-driver/mysql //终端 运行 go get -u github.com/jmoiron/sqlx //操作包 import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) var ( //全局变量 数据库账号 sql_userName string = "userName" //全局变量 数据库账号 sql_password string = "password" //全局变量 数据库密码 sql_ipAddrees string = "127.0.0.1" //全局变量 数据库地址 sql_port int = 3306 //全局变量 数据库端口 sql_dbName string = "userNametest" //全局变量 数据库表名 sql_charset string = "utf8" //全局变量 数据库文本格式 ) //链接数据库 func ConnectMysql() *sqlx.DB { dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", sql_userName, sql_password, sql_ipAddrees, sql_port, sql_dbName, sql_charset) Db, err := sqlx.Open("mysql", dsn) if err != nil { //异常打印 fmt.Printf("\nmysql connect failed (链接数据库异常), detail is [%v]", err.Error()) } //defer Db.Close() return Db } //插入一条 func CommentAdd_life(db_comment string) string { var sqls = "INSERT INTO `life_data` (`id`, `idSchool`, `userid`) VALUES ('1234', '1', '2')" fmt.Printf("\n执行查询语句: %s", sqls) var Db = ConnectMysql().DB //链接数据库 //============插入============= _, err := Db.Exec(sqls) //执行 if err != nil { //异常打印 fmt.Printf("\ndata insert faied,异常打印 error:[%v]", err.Error()) } Db.Close() //关闭数据库 return "0" } //查询数据单条 fun querOne(Db *sqlx.DB, id string, sum string){ var sqls string = "select * from id where `id` = '123455'" var Db = sql.ConnectMysql().DB //链接数据库 //defer Db.Close() //延迟关闭数据库 rows := Db.QueryRow(sqls) //执行查询单条 rows.Scan( //大坑 需要与字段与存储变量一一对应 &id, //存储结果 &user, ) Db.Close() //关闭数据库 必须 } //查询多条 func QueryInfo_data() { var Db = sql.ConnectMysql().DB //链接数据库 //defer Db.Close() //延迟关闭数据库 var ArrGood, ArrBad, ArrLabel, ArrImg string //获取列名 //columns, _ := rows.Columns() //fmt.Println(columns) sqls := "select * from `db_data` where id = '1234567890' " rows, _ := Db.Query(sqls) //执行查询 for rows.Next() { //接收查询数据 err := rows.Scan( //大坑 需要与字段与存储变量一一对应 &ArrGood, &ArrBad, &ArrLabel, &ArrImg, ) if err != nil { //异常处理 fmt.Printf("get data failed,异常 error:[%v]", err.Error()) } } rows.Close() //关闭结果集(释放连接) Db.Close() //关闭数据库 (必须 否则宕机) }
751 Views