go-mysql 基础学习
1.下载mysql驱动
go需要安装数据库驱动,git下载安装包,
github.com/go-sql-driver/mysql是最基础的包,可能某些框架或者某些插件中有封装更好的mysql操作,但基本操作同下面的是相似的
go get -u github.com/go-sql-driver/mysql
2.打开数据库连接
mysql数据库的链接字符串组织:用户名:密码@tcp(数据库IP:端口)/数据库名?charset=utf8&parseTime=True
,
如果表中有datetime字段,加上parseTime=True,不然解析不了这个类型。
//打开数据库连接
db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3305)/mydatabase?charset=utf8&parseTime=True")
//记得释放资源
defer db.Close()
if err != nil {
fmt.Println("数据库链接错误", err)
return
}
#假设创建学生表如下
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT '' COMMENT '姓名',
`age` int(11) DEFAULT '0' COMMENT '年龄',
`sex` int(11) DEFAULT '0' COMMENT '性别',
`addTime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
)
3.查询数据 QueryRow 、Query
type Student struct{
ID int64
Name string
Age int32
Sex int32
AddTime int32
}
//-----1.单条查询-----
var stu Student
rows := db.QueryRow("select * from student where id = ?", 1)
rows.Scan(&stu.ID, &stu.Name, &stu.Age, &stu.Sex, &stu.AddTime)
//-----2.多条查询-----
//查询年龄>20的学生
rows2, err := db.Query("select * from student where age > ?", 20)
if err != nil {
fmt.Println("多条数据查询错误", err)
return
}
//定义对象数组,用于接收数据
var stuList []Student
for rows2.Next() {
var stu2 Student
rows2.Scan(&stu.ID, &stu.Name, &stu.Age, &stu.Sex, &stu.AddTime)
//加入数组
stuList = append(stuList, stu2)
}
4.修改数据Exec
//-----1.新增数据-----
result, err := db.Exec("insert into student(name,age,sex,addTime) values(?,?,?,Now())", "张三", 21, 2)
if err != nil {
fmt.Println("新增数据错误", err)
return
}
newID, IDErr := result.LastInsertId() //新增数据的ID
i, affectErr := result.RowsAffected() //受影响行数
//-----2.修改数据-----
result2, err := db.Exec("update student set age=20 where id = ?", 1)
if err != nil {
fmt.Println("修改数据错误", err)
return
}
i2, affectErr2 := result2.RowsAffected() //受影响行数
//-----3.删除数据------
result3, err := db.Exec("delete from student where name = ?", "张三")
if err != nil {
fmt.Println("删除数据错误", err)
return
}
i3, affectErr3 := result3.RowsAffected()
5.事务
//-----1.事务-----
tx, beginErr := db.Begin() //开始事务
result4, err := tx.Exec("update doctor_tb set age = age + 1 where name = ?", "张三")
result5, err := tx.Exec("update doctor_tb set age = age + 1 where name = ?", "李四")
//影响行数,为0则失败
i4, affectErr4 := result4.RowsAffected()
i5, affectErr5 := result5.RowsAffected()
if i4 > 0 && i5 > 0 {
//2条数据都更新成功才提交事务
err = tx.Commit() //提交事务
if err != nil {
fmt.Println("事务提交失败", err)
return
}
fmt.Println("事务提交成功")
} else {
//否则回滚事务
err = tx.Rollback() //回滚事务
if err != nil {
fmt.Println("回退事务失败", err)
return
}
fmt.Println("回退事务成功")
}