go中mysql的使用
文章目录
1. 导入mysql驱动
mysql驱动,我们用对的最多的是github.com/go-sql-driver/mysql
,一些很多框架的mysql驱动也是这个。
之所以要导入驱动,是因为golang里面,并没有实现mysql的各项功能,它只定义了一系列sql方便的接口,然后,你可以用mysql驱动去实现这个接口,间接的实现mysql的功能。如果你用的是mssql驱动去实现,那么就可以实现mssql的功能。
所以一般是这样导入mysql驱动:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
前面这个_
是咋回事?
当导入一个包时,该包下的文件里所有init()
函数都会被执行,然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()
函数而已。这个时候就可以使用import _
引用该包。即使用【import _ 包路径】只是引用该包,仅仅是为了调用init()函数,所以无法通过包名来调用包中的其他函数。
所以,第二个import就是不直接使用MySQL包,只是执行一下这个包的init函数,把mysql的驱动注册到sql包里,然后程序里就可以使用sql包来访问mysql数据库了。
这和前面那一篇关于接口的文章,也写了的。A实现了接口B,一般都会直接用B去调用相关的方法。所以,这里mysq也是的。渠道实现了sql的方法,我们直接去调用sql接口的方法接口,mysql驱动就不要去调用了。
2. 连接mysql
使用mysql的第一步是连接mysql服务器,连接mysql,用的是sql.Open(name, dsn)
方法。
func GetDB() *sql.DB {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/ApiDB?charset=utf8") //第一个参数数驱动名
if err != nil {
panic(err.Error())
}
return db
}
其中Open
函数的用法如下:
func Open(driverName, dataSourceName string) (*DB, error)
第一个参数,表示是驱动名字,我们填mysql
,也可以填写其他的驱动,比如:sqlite3
,postgres
等。
第二个参数,是dsn,表示需要连接的数据源的服务器地址。可以有多种写法,你用一种自己常用的就行:
// 账号:密码@tcp(ip:端口)/数据库名字?charset=字符集
dsn := "root:123456@tcp(127.0.0.1:3306)/ApiDB?charset=utf8"
3. 插入数据 (insert)
在说插入数据之前,我们先来构建一张表:
CREATE TABLE `userinfo` (
`uid` INT(10) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(64) NULL DEFAULT NULL,
`departname` VARCHAR(64) NULL DEFAULT NULL,
`created` DATE NULL DEFAULT NULL,
PRIMARY KEY (`uid`)
)
插入数据,有2种方式:
1.直接Exec执行:
result, err := db.Exec("INSERT INTO userinfo (username, departname, created) VALUES (?, ?, ?)","lisi","dev","2020-08-04")
2.先使用Prepare获得stmt,然后调用Exec执行插入。
smtp, err := db.Prepare("insert into userinfo set username=?, departname=?, created=?")
result2, err := smtp.Exec("zhangsan", "pro", time.Now().Format("2006-01-02"))
我们分别用这2种方式来写一下:
第一种:
func Add() {
//链接mysql
db := GetDB()
defer db.Close()
//方法1, 插入数据
result, err := db.Exec("insert into userinfo (username, departname, created) VALUES (?, ?, ?)", "zhangsan", "dev", "2020-08-16")
if err != nil {
fmt.Println("insert err: ", err.Error())
}
//自增ID
id, _ := result.LastInsertId()
fmt.Println("id is :", id)
}
第二种方式:
func Add2() {
//链接mysql
db :=