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() //关闭数据库 (必须 否则宕机)
}