使用Go语言简单调用MySql
1.数据新增
简单演示使用Mysql向表格中添加个人信息
1.1数据库准备
- 在MySQL中新建数据库名称first(名称不限,可自设)
- 新建表(在此处添加了一个表格,记录了people的id、name、address)
create table people(
id int primary key auto_increment, //自动生成
name varchar(20),
address varchar(20)
)
1.2.代码实现
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql" //驱动已经放入到标准库文件夹,由于不使用所以需要空导入,在前面添加_
"database/sql" //Golang中数据库操作包
)
func main() {
/*
第一个参数:连接什么数据库
第二个参数:连接字符串
语法:数据库登录用户名:密码@tcp(mysql主机ip:端口)/database名称
*/
db,err:=sql.Open("mysql","root:root@tcp(localhost:3306)/first")
db.Ping()
//Error处理
if err!=nil{
fmt.Println("数据库连接失败")
}
//关闭连接
defer func() {
if db!=nil{
db.Close()
}
fmt.Println("关闭连接")
}()
/*
准备处理SQL语句
支持占位符,防止SQL注入
*/
stmt,err:=db.Prepare("insert into people values(default,?,?)")
//错误处理
if err!=nil{
fmt.Println("预处理失败",err)
}
//关闭对象
defer func() {
if stmt!=nil{
stmt.Close()
}
}()
/*
Exec() 参数为不定项参数,对应占位符?个数
*/
res,err:=stmt.Exec("张三","海淀")
//错误处理
if err!=nil{
fmt.Println("执行SQL出现错误")
}
//获取生成主键
id,err:=res.LastInsertId()
if err!=nil{
fmt.Println("获取主键失败",err)
}
//受影响行数
count,err:=res.RowsAffected()
if err!=nil{
fmt.Println("获取结果失败",err)
}
fmt.Println(id,count)
if count>0{
fmt.Println("新增成功")
}else{
fmt.Println("新增失败")
}
}
在该部分值得注意的是在引入_ "github.com/go-sql-driver/mysql"时,可能会出现错误
报错信息为:
package goproxy.cn/go-sql-driver/mysql/...: unrecognized import path "goproxy.cn/go-sql-driver/mysql": reading https://goproxy.cn/go-sql-driver/mysql?go-get=1: 404 Not Found
server response: not found
这个时候系统表示mysql驱动的地址找不到。
很大一部分原因是不能翻墙导致的。(可以翻墙的话应该没什么问题)
这个时候可以使用中国代理。
用快捷键⌘+R,输入cmd,打开命令符
用指令设置env proxy:
go env -w GOPROXY=https://goproxy.cn,direct
应该就可以正常使用了。
如果还是不行的话,打开网址:
https://codeload.github.com/go-sql-driver/mysql/zip/refs/heads/master
下载压缩包mysql-master
在GOPATH路径下打开src文件夹,
沿着路径
src\github.com\go-sql-driver\mysql
找到mysql文件夹,将下载好的mysql-master解压到mysql中。
2.数据修改
2.1. 修改注意点
- 修改和新增类似,只是不需要获取LastInsertId()和SQL语句是修改语句
- 在Golang中要求:如果修改前和修改后的值相同,RowsAffected()返回0
2.2.代码实现
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"database/sql"
)
func main() {
db,err:=sql.Open("mysql","root:root@tcp(localhost:3306)/first")
db.Ping()
//Error处理
if err!=nil{
fmt.Println("数据库连接失败")
}
//关闭连接
defer func() {
if db!=nil{
db.Close()
fmt.Println("关闭连接")
}
}()
/*
准备处理SQL语句
支持占位符,防止SQL注入
*/
stmt,err:=db.Prepare("update people set name=?,address=? where id=?")
//错误处理
if err!=nil{
fmt.Println("预处理失败",err)
}
//关闭对象
defer func() {
if stmt!=nil{
stmt.Close()
fmt.Println("stmt关闭")
}
}()
/*
Exec() 参数为不定项参数,对应占位符?个数
*/
res,err:=stmt.Exec("李四","朝阳",1)
//错误处理
if err!=nil{
fmt.Println("执行SQL出现错误")
}
//受影响行数
count,err:=res.RowsAffected()
if err!=nil{
fmt.Println("获取结果失败",err)
}
if count>0{
fmt.Println("修改成功")
}else{
fmt.Println("修改失败")
}
}
3.数据删除
3.1.删除注意点
- 删除和修改、新增结构一样,区别为SQL语句
- 在Go语言中要求如果要删除的数据不存在RowsAffected()返回0
3.2.代码实现
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"database/sql"
)
func main() {
db,err:=sql.Open("mysql","root:root@tcp(localhost:3306)/first")
db.Ping()
//Error处理
if err!=nil{
fmt.Println("数据库连接失败")
}
//关闭连接
defer func() {
if db!=nil{
db.Close()
fmt.Println("关闭连接")
}
}()
/*
准备处理SQL语句
支持占位符,防止SQL注入
*/
stmt,err:=db.Prepare("delete from people where id=?")
//错误处理
if err!=nil{
fmt.Println("预处理失败",err)
}
//关闭对象
defer func() {
if stmt!=nil{
stmt.Close()
fmt.Println("stmt关闭")
}
}()
/*
Exec() 参数为不定项参数,对应占位符?个数
*/
res,err:=stmt.Exec(1)
//错误处理
if err!=nil{
fmt.Println("执行SQL出现错误")
}
//受影响行数
count,err:=res.RowsAffected()
if err!=nil{
fmt.Println("获取结果失败",err)
}
if count>0{
fmt.Println("删除成功")
}else{
fmt.Println("删除失败")
}
}
4.数据查询
4.1查询注意点
- Golang中执行查询与新增、删除、修改中stmt的执行方法有区别,由于需要把查询到的结果取出来,所以还需要进行取值处理
4.2.代码示例
package main
import (
"fmt"
//驱动已经放入到标准库文件夹,由于不使用所以需要空导入,在前面添加_
_ "github.com/go-sql-driver/mysql"
//Golang中数据库操作包
"database/sql"
)
func main() {
/*
第一个参数:连接什么数据库
第二个参数:连接字符串
语法:数据库登录用户名:密码@tcp(mysql主机ip:端口)/database名称
*/
db,err:=sql.Open("mysql","root:root@tcp(localhost:3306)/first")
db.Ping()
//Error处理
if err!=nil{
fmt.Println("数据库连接失败")
}
//关闭连接
defer func() {
if db!=nil{
db.Close()
fmt.Println("关闭连接")
}
}()
/*
准备处理SQL语句
支持占位符,防止SQL注入
*/
stmt,err:=db.Prepare("select * from people")
//错误处理
if err!=nil{
fmt.Println("预处理失败",err)
}
//关闭对象
defer func() {
if stmt!=nil{
stmt.Close()
fmt.Println("stmt关闭")
}
}()
/*
Exec() 参数为不定项参数,对应占位符?个数
*/
rows,err:=stmt.Query()
if err!=nil{
fmt.Println("查询失败",err)
}
//循环遍历结果
for rows.Next(){
var id int
var name,address string
//把行内值付给变量
rows.Scan(&id,&name,&address)
fmt.Println(id,name,address)
}
defer func() {
if rows!=nil{
rows.Close()
fmt.Println("关闭结果集")
}
}()
}
本文是我作为萌新在学习过程中做的学习笔记,很多代码来自尚学堂