我是靠谱客的博主 活力铃铛,最近开发中收集的这篇文章主要介绍Go-MySQL(一)Go操作MySQL进行CRUD基本操作Go-MySQL(一)Go操作MySQL进行CRUD基本操作,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- Go-MySQL(一)Go操作MySQL进行CRUD基本操作
- 连接
- 查询
- 单条查询
- 多条查询
- 更新
- 事务
- 完整demo
Go-MySQL(一)Go操作MySQL进行CRUD基本操作
连接
下载go-mysql驱动
go get -u github.com/go-sql-driver/mysql
导入包,只在导包的时候调用包init函数即可,其他函数不用,采用匿名导包
import (
_ "github.com/go-sql-driver/mysql"
)
连接数据库:
// 数据库连接
func connect() *sql.DB{
db,err := sql.Open("mysql","root:123@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True")
if err != nil{
log.Fatal("数据库连接失败")
}
return db
}
username:password@tcp:数据库链接:端口号
本文采用的表如下:
CREATE TABLE `doctor_tb` (
`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`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='医生表';
数据库数据结构:
type Doctor struct {
ID int32
Name string
Age int32
Sex int32
AddTime time.Time
}
查询
单条查询
// 查询单条数据
func QueryOne(db *sql.DB) {
doc := Doctor{}
rows := db.QueryRow("select * from doctor_tb where id = ?", 1)
// rows.Scan 用于把读取的数据赋值到Doctor对象的属性上,要注意字段顺序,按照表定义顺序
err1 := rows.Scan(&doc.ID, &doc.Name, &doc.Age, &doc.Sex, &doc.AddTime)
if err1 != nil{
log.Fatal(err1)
}
//延迟到函数结束关闭链接
defer db.Close()
fmt.Println("单条数据结果:", doc)
}
- db.QueryRow:传入查询sql和参数即可,?占位符
- rows.Scan:用于把读取的数据赋值到Doctor对象的属性上,要注意字段顺序,按照表定义顺序
多条查询
// 查询多条数据
func QueryRows(db *sql.DB) {
rows,err := db.Query("select * from doctor_tb where id > ?",0)
if err != nil{
log.Fatal(err)
}
doctors := []Doctor{}
// 迭代结果集
for rows.Next(){
doc := Doctor{}
if e := rows.Scan(&doc.ID, &doc.Name, &doc.Age, &doc.Sex, &doc.AddTime); e != nil{
log.Fatal(e)
}
doctors = append(doctors, doc)
}
fmt.Println("查询多条数据:",doctors)
defer db.Close()
}
更新
增删改都是通过db.Exec()
// 新增数据
func UpdateData(db *sql.DB,sql string,args... interface{}) {
// 增删改都是通过db.Exec()执行sql实现
// 遇到:unsupported type []interface {}, a slice of interface
// 解决:https://www.shangmayuan.com/a/1b423b1d401d4777a76202e4.html
result,err := db.Exec(sql,args...)
if err != nil{
log.Fatal(err)
}
// 受影响的行数
rows,_ := result.RowsAffected()
id,_ := result.LastInsertId()
fmt.Println("受影响行数:",rows)
fmt.Println("自增id:",id)
}
注意:可变参数传入Exec函数的要加上…,才能识别为可变参数,否则被识别为[]interface{}这一个参数而已
事务
func UpdateDataWithTx(db *sql.DB) {
// 开始事务
tx,err := db.Begin()
if err != nil{
log.Fatal(err)
}
UpdateData(db,"update doctor_tb set age=20 where id = ?", 3)
UpdateData(db,"update doctor_tb set age=20 where id = ?", 2)
// 提交事务
if e := tx.Commit();e != nil{
// 报错则回滚
tx.Rollback()
}
defer db.Close()
}
整体来说go操作mysql还是挺简单的
完整demo
package go_mysql
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
"time"
)
func TestMysql() {
//go QueryRows(connect())
//go QueryOne(connect())
//go UpdateData(connect(),"insert into doctor_tb(id,name,age,sex,addTime)values(?,?,?,?,Now())",4,"test",10,1)
//go UpdateData(connect(),"update doctor_tb set age=20 where id = ?", 1)
//go UpdateData(connect(),"delete from doctor_tb where name = ?", "kevin")
go UpdateDataWithTx(connect())
time.Sleep(2 * time.Second)
}
// 数据库连接
func connect() *sql.DB{
db,err := sql.Open("mysql","root:123@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True")
if err != nil{
log.Fatal("数据库连接失败")
}
return db
}
type Doctor struct {
ID int32
Name string
Age int32
Sex int32
AddTime time.Time
}
// 查询单条数据
func QueryOne(db *sql.DB) {
doc := Doctor{}
rows := db.QueryRow("select * from doctor_tb where id = ?", 1)
// rows.Scan 用于把读取的数据赋值到Doctor对象的属性上,要注意字段顺序,按照表定义顺序
err1 := rows.Scan(&doc.ID, &doc.Name, &doc.Age, &doc.Sex, &doc.AddTime)
if err1 != nil{
log.Fatal(err1)
}
//延迟到函数结束关闭链接
defer db.Close()
fmt.Println("单条数据结果:", doc)
}
// 查询多条数据
func QueryRows(db *sql.DB) {
rows,err := db.Query("select * from doctor_tb where id > ?",0)
if err != nil{
log.Fatal(err)
}
doctors := []Doctor{}
// 迭代结果集
for rows.Next(){
doc := Doctor{}
if e := rows.Scan(&doc.ID, &doc.Name, &doc.Age, &doc.Sex, &doc.AddTime); e != nil{
log.Fatal(e)
}
doctors = append(doctors, doc)
}
fmt.Println("查询多条数据:",doctors)
defer db.Close()
}
// 新增数据
func UpdateData(db *sql.DB,sql string,args... interface{}) {
// 增删改都是通过db.Exec()执行sql实现
// 遇到:unsupported type []interface {}, a slice of interface
// 解决:https://www.shangmayuan.com/a/1b423b1d401d4777a76202e4.html
result,err := db.Exec(sql,args...)
if err != nil{
log.Fatal(err)
}
// 受影响的行数
rows,_ := result.RowsAffected()
id,_ := result.LastInsertId()
fmt.Println("受影响行数:",rows)
fmt.Println("自增id:",id)
}
func UpdateDataWithTx(db *sql.DB) {
// 开始事务
tx,err := db.Begin()
if err != nil{
log.Fatal(err)
}
UpdateData(db,"update doctor_tb set age=20 where id = ?", 3)
UpdateData(db,"update doctor_tb set age=20 where id = ?", 2)
// 提交事务
if e := tx.Commit();e != nil{
// 报错则回滚
tx.Rollback()
}
defer db.Close()
}
最后
以上就是活力铃铛为你收集整理的Go-MySQL(一)Go操作MySQL进行CRUD基本操作Go-MySQL(一)Go操作MySQL进行CRUD基本操作的全部内容,希望文章能够帮你解决Go-MySQL(一)Go操作MySQL进行CRUD基本操作Go-MySQL(一)Go操作MySQL进行CRUD基本操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复