美文网首页
go 链接mysql

go 链接mysql

作者: 蛐蛐儿阳 | 来源:发表于2020-04-26 19:02 被阅读0次

我的所有英文日志都被我设置成私密了,整理起来还不少。
好,今天主题是用go去链接mysql。开整。
这个主题实在没什么技术含量,我们就放test文件夹了,里面建立一个mysql文件夹。 go 和 java, c一样,一个程序就一个main入口,我原来建立的文件,每个文件都有一个main入口, 每次快捷键编译的时候都得重新指定文件。不废话了,开始写代码。
参考文档,大多数都用的这个包

go get github.com/go-sql-driver/mysql
网上说的错误 go get -u
我去 https://github.com/go-sql-driver/mysql 这个网址,并没有被墙,
反正我用 go get github.com/go-sql-driver/mysql 命令卡住,我直接
 git clone https://github.com/go-sql-driver/mysql.git
很快,我拿到包了。
image.png

这个命令隔了二十多分钟,啥输出也没有,不过我看库里面,已经有这个包了。

折腾了半天是我不想把我常用密码贴这, 我给mysql新添加了用户,并给了所有权限。
mysql 8 给用户所有权限用
GRANT ALL ON . TO 'gly'@'%';
原来语句放 8 里面会报错。
折腾了两个小时我代码出来了啊

package main

import (
    "database/sql"
    "fmt"
    _"github.com/go-sql-driver/mysql"
    //_ "strings"
)

const (
    DBHostsIp  = "localhost:3306"
    DBUserName = "gly"
    DBPassWord = "123"
    DBName     = "golang"
)

//插入demo
func insert(db *sql.DB)  {
    //准备插入操作
    stmt,err := db.Prepare("INSERT INTO test (`value`) values (?)")
    CheckErr(err)
    //执行插入操作
    res,err := stmt.Exec("看看")
    CheckErr(err)
    //返回最近的自增主键id
    id,err := res.LastInsertId()
    fmt.Println("LastInsertId: ",id)
}
//查询demo
func query(db *sql.DB)  {
    //rows:返回查询操作的结果集
    rows,err := db.Query("SELECT * FROM test")
    CheckErr(err)
    //第一步:接收在数据库表查询到的字段名,返回的是一个string数组切片
    columns, _ := rows.Columns() // columns:  [user_id user_name user_age user_sex]
    //根据string数组切片的长度构造scanArgs、values两个数组,scanArgs的每个值指向values相应值的地址
    scanArgs := make([]interface{}, len(columns))
    values := make([]interface{}, len(columns))
    for i := range values {
        scanArgs[i] = &values[i]
    }
    for rows.Next() {
        //将查询到的字段名的地址复制到scanArgs数组中
        err = rows.Scan(scanArgs...)
        CheckErr(err)
        //将行数据保存到record字典
        record := make(map[string]string)
        for i, col := range values {
            if col != nil {
                //字段名 = 字段信息
                record[columns[i]] = string(col.([]byte))
            }
        }
        fmt.Println(record)
    }
}
//更新demo
func update(db *sql.DB)  {
    //准备更新操作
    stmt1,err := db.Prepare("UPDATE test SET `value`=? WHERE `id`=?")
    CheckErr(err)
    //执行更新操作
    res1, err := stmt1.Exec("更改值", 1)
    CheckErr(err)
    //查询更新多少条信息
    num, err := res1.RowsAffected()
    CheckErr(err)
    fmt.Println(num)
}
//删除demo
func remove(db *sql.DB)  {
    //准备删除操作
    stmt, err := db.Prepare(`DELETE FROM test WHERE id=?`)
    CheckErr(err)
    //执行删除操作
    res, err := stmt.Exec(2)
    CheckErr(err)
    //查询删除多少条信息
    num, err := res.RowsAffected()
    CheckErr(err)
    fmt.Println(num)
}

//检查错误信息
func CheckErr(err error)  {
    if err != nil {
        panic(err)
    }
}

func main()  {
    //连接至数据库
    db,err := sql.Open("mysql", DBUserName+":"+DBPassWord+"@tcp("+DBHostsIp+")/"+DBName)
    CheckErr(err)
    // 插入语句可用
    //insert(db)
    // 搜索语句 可用
    //query(db)
    //更改语句 改成了返回1 没改反0
    //update(db)
    // 还是 删好了返回1 否则返回0
    remove(db)

    //关闭数据库连接
    db.Close()
}

跑了下代码可用, 增删改查都没问题。 这里方法原始, php或java后期的现成代码,你都不用写sql。
而且上方代码杂乱,我打包修改后上传到云。
看似奇怪的地方是引入包 _"github.com/go-sql-driver/mysql", 但你代码里有没用, 我删掉这个引入却又报错, 说明第二个包 database/sql 在用。
好,我去整理代码。
这是最后代码,我分成了两个文件
query.go

package query

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    _"reflect"
)


const (
    DBHostsIp  = "localhost:3306"
    DBUserName = "gly"
    DBPassWord = "123"
    DBName     = "golang"
    TableName string = "test"
)

func GetCon()  *sql.DB{
    db ,err := sql.Open("mysql", DBUserName+":"+DBPassWord+"@tcp("+DBHostsIp+")/"+DBName)
    CheckErr(err)
    return db
}

func Insert()  {
    //准备插入操作
    stmt,err := GetCon().Prepare("INSERT INTO "+TableName+" (`value`) values (?)")
    CheckErr(err)
    //执行插入操作
    res,err := stmt.Exec("看看")
    CheckErr(err)
    //返回最近的自增主键id
    id,err := res.LastInsertId()
    fmt.Println("LastInsertId: ",id)
}
//查询demo
func query()  {
    //rows:返回查询操作的结果集
    rows,err := GetCon().Query("SELECT * FROM test")
    CheckErr(err)
    //第一步:接收在数据库表查询到的字段名,返回的是一个string数组切片
    columns, _ := rows.Columns() // columns:  [user_id user_name user_age user_sex]
    //根据string数组切片的长度构造scanArgs、values两个数组,scanArgs的每个值指向values相应值的地址
    scanArgs := make([]interface{}, len(columns))
    values := make([]interface{}, len(columns))
    for i := range values {
        scanArgs[i] = &values[i]
    }
    for rows.Next() {
        //将查询到的字段名的地址复制到scanArgs数组中
        err = rows.Scan(scanArgs...)
        CheckErr(err)
        //将行数据保存到record字典
        record := make(map[string]string)
        for i, col := range values {
            if col != nil {
                //字段名 = 字段信息
                record[columns[i]] = string(col.([]byte))
            }
        }
        fmt.Println(record)
    }
}
//更新demo
func update()  {
    //准备更新操作
    stmt1,err := GetCon().Prepare("UPDATE test SET `value`=? WHERE `id`=?")
    CheckErr(err)
    //执行更新操作
    res1, err := stmt1.Exec("更改值", 1)
    CheckErr(err)
    //查询更新多少条信息
    num, err := res1.RowsAffected()
    CheckErr(err)
    fmt.Println(num)
}
//删除demo
func remove()  {
    //准备删除操作
    stmt, err := GetCon().Prepare(`DELETE FROM test WHERE id=?`)
    CheckErr(err)
    //执行删除操作
    res, err := stmt.Exec(2)
    CheckErr(err)
    //查询删除多少条信息
    num, err := res.RowsAffected()
    CheckErr(err)
    fmt.Println(num)
}

//检查错误信息
func CheckErr(err error)  {
    if err != nil {
        panic(err)
    }
}

main.go

package main

import (
    "test/mysql/query"
)
func main()  {
    query.Insert()
    ////连接至数据库
    //db,err := sql.Open("mysql", DBUserName+":"+DBPassWord+"@tcp("+DBHostsIp+")/"+DBName)
    //CheckErr(err)
    //// 插入语句可用
    ////insert(db)
    //// 搜索语句 可用
    ////query(db)
    ////更改语句 改成了返回1 没改反0
    ////update(db)
    //// 还是 删好了返回1 否则返回0
    //remove(db)
    //
    ////关闭数据库连接
    //db.Close()
}

我已经上传至代码云,好了,开始在尝试redis
我本来想搞个类似php的model模块,以后在说吧,现在先分出来了。

相关文章

网友评论

      本文标题:go 链接mysql

      本文链接:https://www.haomeiwen.com/subject/tqxjwhtx.html