Go·对MySQL操作增删查改

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
//终端 运行(开启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
}

// 查询数据
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
//终端 运行(开启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"
}
//查询
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()   //关闭数据库 (必须 否则宕机)

}
26 Views
分享你的喜爱
默认图片
linwute

我要像梦一样自由,像大地一样宽容;
在艰辛放逐的路上,点亮生命的光芒;
我要像梦一样自由,像天空一样坚强;
在曲折蜿蜒的路上,体验生命的意义;

留下评论