Golang原生sql操作Mysql数据库增删改查
Golang要操作mysql数据库,首先需要在当期系统配置GOPATH,因为需要使用go get命令把驱动包下载到GOPATH下使用。
首先配置好你的GOPATH,执行以下命令,下载安装mysql驱动,下载完成之后会在GOPATH下的src/github.com目录下
go get -u github.com/go-sql-driver/mysql
然后本地的mysql服务要启动,并创建一个表作为测试
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET latin1 NOT NULL DEFAULT '',
`age` tinyint(4) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
连接mysql数据库,导入mysql驱动包,并使用datebase/sql Open函数进行连接
//mysql数据库,用户名:密码@tcp连接:端口3306/test库?字符集utf8
db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test?charset=utf8") //返回连接字符,和err
代码
package main
import (
"database/sql" // 这是一个抽象层包,比如区分mysql、orcal等数据库,只有这个包是连接不上mysql的,还需要搭配下面的mysql包
"fmt"
_ "github.com/go-sql-driver/mysql" //导入mysql驱动包
)
func init() {
}
func main() {
//mysql数据库,用户名:密码@tcp连接:端口3306/test库?字符集utf8
db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test?charset=utf8") //返回连接字符,和err
if err != nil {
panic(err)
}
//增加数据
stmt, err := db.Prepare(`INSERT student (name,age) values (?,?)`)
res, err := stmt.Exec("wangwu", 26)
id, err := res.LastInsertId()
fmt.Println("自增id=", id)
//修改数据
stmt, err := db.Prepare(`UPDATE student SET age=? WHERE id=?`)
res, err := stmt.Exec(21, 5)
num, err := res.RowsAffected() //影响行数
fmt.Println(num)
//删除数据
stmt, err := db.Prepare(`DELETE FROM student WHERE id=?`)
res, err := stmt.Exec(5)
num, err := res.RowsAffected()
fmt.Println(num)
//查询数据
rows, err := db.Query("SELECT * FROM student")
//--------简单一行一行输出---start
// for rows.Next() { //满足条件依次下一层
// var id int
// var name string
// var age int
// rows.Columns()
// err = rows.Scan(&id, &name, &age)
// fmt.Println(id)
// fmt.Println(name)
// fmt.Println(age)
// }
//--------简单一行一行输出---end
//--------遍历放入map----start
//构造scanArgs、values两个数组,scanArgs的每个值指向values相应值的地址
columns, _ := rows.Columns()
scanArgs := make([]interface{}, len(columns))
values := make([]interface{}, len(columns))
for i := range values {
scanArgs[i] = &values[i]
}
for rows.Next() {
//将行数据保存到record字典
err = rows.Scan(scanArgs...)
record := make(map[string]string)
for i, col := range values {
if col != nil {
record[columns[i]] = string(col.([]byte))
}
}
fmt.Println(record)
}
//--------遍历放入map----end
}