rinetd 私有变量 cordova unity3d plot import devise coldfusion react脚手架 直销系统源码 jq去空格 jquery延时 js空格符 虚拟机重启命令 bootstrap颜色 idea全局替换 mysql插入 pythoninput python简易教程 python函数参数 python路径设置 java实用教程 java结构 java入门代码 java接口开发 linux的find javascript基础 计算机电子书 html特殊字符 免费脚本 getelementbyid win10有哪些版本 dnf瞎子传说套选择 免费微信答题制作 js字符转数字 jdk9下载 cad特性匹配 mtu设置多少最好 mix2s拆机 什么是人肉搜索
当前位置: 首页 > 学习教程  > 编程语言

Go语言基础——MySQL连接与使用

2021/1/28 22:32:02 文章标签:

Go语言基础——MySQL连接与使用一,MySQL的连接二,Insert操作:三,Select操作四,update操作一,MySQL的连接 mysql的连接需要使用到的第三方mysql库: github.com/go-sql-driver/mysql &#xff0…

Go语言基础——MySQL连接与使用

    • 一,MySQL的连接
    • 二,Insert操作:
    • 三,Select操作
    • 四,update操作

一,MySQL的连接

  1. mysql的连接需要使用到的第三方mysql库:
  • github.com/go-sql-driver/mysql (mysql驱动)
  • github.com/jmoiron/sqlx (基于mysql驱动的封装)
    获取方式:在IDE的命令行中输入:
  go get github.com/go-sql-driver/mysql 
  go get github.com/jmoiron/sqlx
  1. mysql的连接语法:
 database, err := sqlx.Open("mysql", "root:XXXX@tcp(127.0.0.1:3306)/test")
    //database, err := sqlx.Open("数据库类型", "用户名:密码@tcp(地址:端口)/数据库名")

二,Insert操作:

(1)连接数据库
(2)插入
(3)关闭数据库连接

  • 代码示例:(本段代码有错误,下面会进行解析)
import (
	"fmt"
	"github.com/jmoiron/sqlx"
)
var  Db  *sqlx.DB //数据库连接驱动
func  init(){
	database,err :=sqlx.Open("mysql","root:root@tcp(127.0.0.1:3306)/user_info")
	if  err!=nil{
		fmt.Println("open  mysql  failed:",err)
		return
	}
	Db  =  database
	defer  Db.Close()
}
func main() {
	r,err :=Db.Exec("insert into  student(studentName,studentMajor,studentDept,studentSex)values (?,?,?,?)","小明","软件工程","计算机科学学院",1)
	if err!=nil{
		fmt.Println("exec  failed",err)
		return
	}
	id,err  :=r.LastInsertId()
	if  err!=nil{
		fmt.Println("exec  failed",err)
		return
	}
	fmt.Println("insert success",id)
}
  • 错误1open mysql failed: sql: unknown driver “mysql” (forgotten import?)
open  mysql  failed: sql: unknown driver "mysql" (forgotten import?)
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0xc5c888]

错误的内容:提示没有导入mysql的驱动。
错误原因:如果直接依赖IDE本身去进行导包的过程,它不会给你导入mysql的驱动包

import (
	"fmt"
	"github.com/jmoiron/sqlx"
	//缺少mysql驱动包,sqlx只是Go对于mysql驱动的封装,帮助使用mysql的
)

因此需要改为:

import (
	"fmt"
	"github.com/jmoiron/sqlx"
	_"github.com/go-sql-driver/mysql"
)

这里的mysql驱动包前面加一个:_表示的是:这个包里面需要执行他的init函数。
为什么加这个呢?
是因为Go的IDE检查如果你代码中没有用到的包,就会报错。因此这里使用这样的方式,避免了IDE的检查报错。(这IDE金笨)

  • 错误2:exec failed sql: database is closed

错误的内容:显示数据库已经关闭了
错误原因:使用defer关闭数据库时出现了错误。defer Db.Close()
会在init函数结束的时候执行。
所以这种类型的资源不需要defer关闭
在这里插入图片描述
关于defer的坑文章链接(点击)
解决方法:去掉init中的defer将其放在main中,数据库没有使用的地方。

三,Select操作

(1)链接数据库
(2)查找
(3)关闭

  • 实例代码:
import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

type Student struct {
	StudentId   int    `db:"studentId"`
	StudentName string `db:"studentName"`
	StudentMajor string `db:"studentMajor"`
	StudentDept   string `db:"studentDept"`
	StudentSex  int `db:"studentSex"`
}
var  db  *sqlx.DB
func init() {
	database, err := sqlx.Open("mysql", "root:h980522@tcp(127.0.0.1:3306)/user_info")
	if err != nil {
		fmt.Println("open  mysql  failed:", err)
		return
	}
	db =database

}
func main() {
	var studentInfo  []Student
	err :=db.Select(&studentInfo,"select  studentId,studentName,studentMajor,studentDept,studentSex  from student  where studentId=?",18)
	if  err!=nil{
		fmt.Println("exec  failed:",err)
		return
	}
	fmt.Println("studentInfo:",studentInfo)
	db.Close()
}

遇到的问题:
最开始的struct里面的变量是首字母小写的,于是出现了这样的错误。
原本的struct:

type Student struct {
	studentId   int    `db:"studentId"`
	studentName string `db:"studentName"`
	studentMajor string `db:"studentMajor"`
	studentDept   string `db:"studentDept"`
	studentSex  int `db:"studentSex"`
}

出现的错误:exec failed: non-struct dest type struct with >1 columns (5)
原因:构体(struct)里面的成员变量首字母是区分大小写的,若首字母大写则该成员为公有成员(对外可见),否则是私有成员(对外不可见)。
如何修改:外部需要访问,改为首字母大写。

四,update操作

(1)链接数据库
(2)更新
(3)关闭

func main() {
	res,err:=db.Exec("update student  set studentName=?  where  studentId=?","小刚","18")
	if err!=nil{
		fmt.Println("exec failed",err)
		return
	}
	row,err :=res.RowsAffected()
	if  err!=nil{
		fmt.Println("row  failed",err)
	}
	fmt.Println("update:",row)
	defer db.Close()
}

本文链接: http://www.dtmao.cc/news_show_650005.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?