我是靠谱客的博主 土豪哑铃,最近开发中收集的这篇文章主要介绍Golang操作MySQL数据库,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

      • 事先准备
      • 插入数据
      • 查询数据
      • 更新操作
      • 删除数据
      • 事务操作

事先准备

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
*/

最后

以上就是土豪哑铃为你收集整理的Golang操作MySQL数据库的全部内容,希望文章能够帮你解决Golang操作MySQL数据库所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部