Golang操作MySQL数据库

13 篇文章 0 订阅
3 篇文章 0 订阅

事先准备

go下载两个东西:

  • MySQL驱动工具
go get github.com/go-sql-driver/mysql 
  • 对mysql驱动的封装,方便我们使用API操作
go get github.com/jmoiron/sqlx

创建数据库和表

# 新建名为gomysql的数据库
create database gomysql;
# 使用这个数据库
use gomysql;
# 创建一张名为person的表
CREATE TABLE `person` (
    `user_id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(50) DEFAULT NULL,
    `sex` varchar(10) DEFAULT NULL,
    `email` varchar(20) DEFAULT NULL,
    PRIMARY KEY (`user_id`)
  ) DEFAULT CHARSET=utf8;
# 表的结构如下
mysql> desc person;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| user_id  | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(50) | YES  |     | NULL    |                |
| sex      | varchar(10) | YES  |     | NULL    |                |
| email    | varchar(20) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

插入数据

package main

import (
	"fmt"

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

var Db *sqlx.DB // 全局变量,初始化后该对象创建,main函数使用到

func init() { // 初始化
	// sqlx.Open("数据库类型", "用户名:密码@tcp(地址:端口)/数据库名")
	database, err := sqlx.Open("mysql", "root:123456@tcp(localhost:3306)/gomysql")
	if err != nil {
		return
	}
	Db = database
}

func main() {
	defer Db.Close()
	// 变量在语句中使用?符号作为占位符
	insertResult, err := Db.Exec("insert into person(username, sex, email) values(?, ?, ?)", "臭宝", "男", "gzcc@qq.com")
	if err != nil {
		fmt.Println("执行命令失败", err)
		return
	}
	id, err := insertResult.LastInsertId() // 该数据来自递增列的数据
	if err != nil {
		fmt.Println("获取最后插入的ID失败", err)
		return
	} else {
		fmt.Println("插入成功,最后插入的ID:", id)
	}
}
/*
插入成功,最后插入的ID: 1
*/

查询数据

package main

import (
	"fmt"

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

type Person struct {
	UserId   int    `db:"user_id"`
	Username string `db:"username"`
	Sex      string `db:"sex"`
	Email    string `db:"email"`
}

var Db *sqlx.DB // 全局变量,初始化后该对象创建,main函数使用到

func init() { // 初始化
	database, err := sqlx.Open("mysql", "root:123456@tcp(localhost:3306)/gomysql")
	if err != nil {
		return
	}
	Db = database
}

func main() {
	defer Db.Close()
	var person []Person
	err := Db.Select(&person, "select * from person where user_id=? or user_id=?", 1, 2)
	if err != nil {
		fmt.Println("执行命令失败", err)
		return
	}
	fmt.Println("查询结果:", person)
}
/*
查询结果: [{1 臭宝 男 gzcc@qq.com} {2 臭宝 男 gzcc@qq.com}]
*/

更新操作

package main

import (
	"fmt"

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

type Person struct {
	UserId   int    `db:"user_id"`
	Username string `db:"username"`
	Sex      string `db:"sex"`
	Email    string `db:"email"`
}

var Db *sqlx.DB // 全局变量,初始化后该对象创建,main函数使用到

func init() { // 初始化
	database, err := sqlx.Open("mysql", "root:123456@tcp(localhost:3306)/gomysql")
	if err != nil {
		return
	}
	Db = database
}

func main() {
	defer Db.Close()
	updateResult, err := Db.Exec("update person set username=? where user_id=?", "牛啊", 1)
	if err != nil {
		fmt.Println("执行命令失败", err)
		return
	}
	// 获取受影响的行数
	row, err := updateResult.RowsAffected()
	if err != nil {
		fmt.Println("更新操作失败", err)
    } else {
        fmt.Println("更新成功,受影响的行数为:", row)
    }
}
/*
更新成功,受影响的行数为: 1
*/

删除数据

package main

import (
	"fmt"

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

type Person struct {
	UserId   int    `db:"user_id"`
	Username string `db:"username"`
	Sex      string `db:"sex"`
	Email    string `db:"email"`
}

var Db *sqlx.DB // 全局变量,初始化后该对象创建,main函数使用到

func init() { // 初始化
	// sqlx.Open("数据库类型", "用户名:密码@tcp(地址:端口)/数据库名")
	database, err := sqlx.Open("mysql", "root:123456@tcp(localhost:3306)/gomysql")
	if err != nil {
		return
	}
	Db = database
}

func main() {
	defer Db.Close()
	updateResult, err := Db.Exec("delete from person where user_id=?", 1)
	if err != nil {
		fmt.Println("执行命令失败", err)
		return
	}
	// 获取受影响的行数
	row, err := updateResult.RowsAffected()
	if err != nil {
		fmt.Println("删除操作失败", err)
	}else{
		fmt.Println("删除成功,受影响的行数为:", row)
	}
}
/*
删除成功,受影响的行数为: 1
*/

事务操作

  • Db.Begin( )开启事务,并返回数据库事务对象,事务对象包含了sqlx.DB对象
  • conn.Rollback( )回滚,发生错误时,可以使用该方法进行回滚操作
  • conn.Commit( )提交事务

下面开启事务,然后进行插入操作,如果插入操作失败就回滚,还进行了删除操作,如果删除失败就回滚,最后提交事务。

package main

import (
	"fmt"

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

type Person struct {
	UserId   int    `db:"user_id"`
	Username string `db:"username"`
	Sex      string `db:"sex"`
	Email    string `db:"email"`
}

var Db *sqlx.DB // 全局变量,初始化后该对象创建,main函数使用到

func init() { // 初始化
	database, err := sqlx.Open("mysql", "root:123456@tcp(localhost:3306)/gomysql")
	if err != nil {
		return
	}
	Db = database
}

func main() {
	defer Db.Close()
	conn, err := Db.Begin() // 开启事务
	if err != nil {
		fmt.Println("事务开启失败")
		return
	}

	insertResult, err := conn.Exec("insert into person(username, sex, email) values(?, ?, ?)", "牛啊", "女", "gzcc@qq.com")
	if err != nil {
		fmt.Println("执行命令失败,开始回滚", err)
		conn.Rollback() // 回滚
		return
	}
	id, err := insertResult.LastInsertId() // 该数据来自递增列的数据
	if err != nil {
		fmt.Println("获取最后插入的ID失败,开始回滚", err)
		conn.Rollback() // 回滚
		return
	} else {
		fmt.Println("插入成功", id)
	}

	updateResult, err := Db.Exec("delete from person where user_id=?", 2)
	if err != nil {
		fmt.Println("执行命令失败,开始回滚", err)
		conn.Rollback() // 回滚
		return
	}
	// 获取受影响的行数
	row, err := updateResult.RowsAffected()
	if err != nil {
		fmt.Println("删除操作失败,开始回滚", err)
		conn.Rollback() // 回滚
	} else {
		fmt.Println("删除成功,受影响的行数为:", row)
	}
    
	conn.Commit()  // 提交
}
/*
插入成功 6
删除成功,受影响的行数为: 1
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值