我的所有英文日志都被我设置成私密了,整理起来还不少。
好,今天主题是用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
很快,我拿到包了。
![](https://img.haomeiwen.com/i13303914/c5dad715f24620fa.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模块,以后在说吧,现在先分出来了。
网友评论