【go笔记】使用sqlx操作MySQL
前言
go在操作MySQL时,可以使用ORM(比如gorm、xorm),也可以使用原生sql。本文以使用sqlx为例,简单记录步骤。
- go version: 1.16
- 安装相关库
# mysql驱动
go get github.com/go-sql-driver/mysql
# 基于MySQL驱动的封装
go get github.com/jmoiron/sqlx
- 连接MySQL
database, err := sqlx.Open("mysql", "username:password@tcp(127.0.0.1:3306)/dbName")
- 测试数据表定义:
CREATE TABLE `person` (
`user_id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(260) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`sex` VARCHAR(260) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`email` VARCHAR(260) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
PRIMARY KEY (`user_id`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
;
初始化MySQL连接
// 数据表person的结构体
type Person struct {
UserId int `db:"user_id"`
Username string `db:"username"`
Sex string `db:"sex"`
Email string `db:"email"`
}
func init() {
// 初始化建立MySQL连接
database,err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/gotest")
if err != nil {
fmt.Println("open mysql failed. ",err)
return
}
// database.SetMaxOpenConns(200)
// database.SetMaxIdleConns(10)
db = database
// defer db.Close()
}
插入数据
func InsertData() {
// 插入数据方式1
result,err := db.Exec("insert into person(username,sex,email) values(?,?,?)", "stu002", "woman", "stu002@email.com")
if err != nil {
fmt.Println("insert data failed, ",err)
return
}
id, err := result.LastInsertId()
if err != nil {
fmt.Println("insert data failed2, ",err)
return
}
fmt.Println("insert data success, ",id)
}
func InsertData2() {
// 插入数据方式2
sqlStr := "insert into person(username,sex,email) values(:username,:sex,:email)"
result,err := db.NamedExec(sqlStr,map[string]interface{}{
"username": "stu003",
"sex": "man",
"email": "stu003@email.com",
})
if err != nil {
fmt.Println("insert data failed, ",err)
return
}
id, err := result.LastInsertId()
if err != nil {
fmt.Println("insert data failed2, ",err)
return
}
fmt.Println("insert data success, ",id)
}
删除数据
func DeleteData() {
// delete 删除数据
result,err := db.Exec("delete from person where username=? and sex=?","stu002","woman")
if err != nil {
fmt.Println("delete data failed, ",err)
return
}
row,err := result.RowsAffected()
if err != nil {
fmt.Println("affected row unknown, ",err)
}
fmt.Println("delete data success: ",row)
}
修改数据
func UpdateData() {
// update修改数据
result,err := db.Exec("update person set sex=? where username=?","woman","stu001")
if err != nil {
fmt.Println("update data failed, ",err)
return
}
row,err := result.RowsAffected()
if err != nil {
fmt.Println("affected row unknown, ",err)
}
fmt.Println("update data success: ",row)
}
查询数据
func SelectData() {
// 查询数据
var person Person
err := db.Get(&person, "select user_id,username,sex,email from person where user_id=?", 2)
if err != nil {
fmt.Println("select data failed, ",err)
return
}
fmt.Println(person.Email)
}
func SelectData2() {
// 查询数据方式2
sqlStr := "select user_id,username,sex,email from person where user_id=:user_id"
rows,err := db.NamedQuery(sqlStr,map[string]interface{}{
"user_id": "2",
})
if err != nil {
fmt.Println("query data error, ",err)
return
}
for rows.Next() {
var person Person
if err := rows.StructScan(&person);err != nil {
fmt.Printf("struct scan failed, %v\n",err)
continue
}
fmt.Println(person)
}
}
事务操作
- 开启事务:
func (db *DB) Begin() (*Tx, error)
- 回滚事务:
func (tx *Tx) Rollback() error
- 提交事务
func (tx *Tx) Commit() error
- 示例:
func InsertDataTransaction() {
tx,err := db.Begin()
if err != nil {
fmt.Println("transaction begin failed, ",err)
return
}
defer func() {
if p := recover(); p != nil {
_ = tx.Rollback()
panic(p)
} else if err != nil {
fmt.Printf("transaction rollback")
_ = tx.Rollback()
} else {
err = tx.Commit()
fmt.Printf("transaction commit")
return
}
}()
sqlStr := "insert into person(username,sex,email) values(?,?,?)"
result,err := tx.Exec(sqlStr,"stu004", "woman", "stu004@email.com")
if err != nil {
fmt.Println("insert data failed, ",err)
return
}
_,err = result.RowsAffected()
if err != nil {
fmt.Println("affected rows num is 0")
return
}
}
完整示例代码
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
// 数据表person的结构体
type Person struct {
UserId int `db:"user_id"`
Username string `db:"username"`
Sex string `db:"sex"`
Email string `db:"email"`
}
// 数据表place的结构体
type Place struct {
Country string `db:"country"`
City string `db:"city"`
Telcode int `db:"telcode"`
}
var db *sqlx.DB
func init() {
// 初始化建立MySQL连接
database,err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/gotest")
if err != nil {
fmt.Println("open mysql failed. ",err)
return
}
// database.SetMaxOpenConns(200)
// database.SetMaxIdleConns(10)
db = database
// defer db.Close()
}
func InsertData() {
// 插入数据
result,err := db.Exec("insert into person(username,sex,email) values(?,?,?)", "stu002", "woman", "stu002@email.com")
if err != nil {
fmt.Println("insert data failed, ",err)
return
}
id, err := result.LastInsertId()
if err != nil {
fmt.Println("insert data failed2, ",err)
return
}
fmt.Println("insert data success, ",id)
}
func InsertData2() {
// 插入数据
sqlStr := "insert into person(username,sex,email) values(:username,:sex,:email)"
result,err := db.NamedExec(sqlStr,map[string]interface{}{
"username": "stu003",
"sex": "man",
"email": "stu003@email.com",
})
if err != nil {
fmt.Println("insert data failed, ",err)
return
}
id, err := result.LastInsertId()
if err != nil {
fmt.Println("insert data failed2, ",err)
return
}
fmt.Println("insert data success, ",id)
}
func SelectData() {
// 查询数据
var person Person
err := db.Get(&person, "select user_id,username,sex,email from person where user_id=?", 2)
if err != nil {
fmt.Println("select data failed, ",err)
return
}
fmt.Println(person.Email)
}
func SelectData2() {
// 查询数据方式2
sqlStr := "select user_id,username,sex,email from person where user_id=:user_id"
rows,err := db.NamedQuery(sqlStr,map[string]interface{}{
"user_id": "2",
})
if err != nil {
fmt.Println("query data error, ",err)
return
}
for rows.Next() {
var person Person
if err := rows.StructScan(&person);err != nil {
fmt.Printf("struct scan failed, %v\n",err)
continue
}
fmt.Println(person)
}
}
func UpdateData() {
// update修改数据
result,err := db.Exec("update person set sex=? where username=?","woman","stu001")
if err != nil {
fmt.Println("update data failed, ",err)
return
}
row,err := result.RowsAffected()
if err != nil {
fmt.Println("affected row unknown, ",err)
}
fmt.Println("update data success: ",row)
}
func DeleteData() {
// delete 删除数据
result,err := db.Exec("delete from person where username=? and sex=?","stu002","woman")
if err != nil {
fmt.Println("delete data failed, ",err)
return
}
row,err := result.RowsAffected()
if err != nil {
fmt.Println("affected row unknown, ",err)
}
fmt.Println("delete data success: ",row)
}
func InsertDataTransaction() {
tx,err := db.Begin()
if err != nil {
fmt.Println("transaction begin failed, ",err)
return
}
defer func() {
if p := recover(); p != nil {
_ = tx.Rollback()
panic(p)
} else if err != nil {
fmt.Printf("transaction rollback")
_ = tx.Rollback()
} else {
err = tx.Commit()
fmt.Printf("transaction commit")
return
}
}()
sqlStr := "insert into person(username,sex,email) values(?,?,?)"
result,err := tx.Exec(sqlStr,"stu004", "woman", "stu004@email.com")
if err != nil {
fmt.Println("insert data failed, ",err)
return
}
_,err = result.RowsAffected()
if err != nil {
fmt.Println("affected rows num is 0")
return
}
}
func main() {
// InsertData()
// InsertData2()
// SelectData()
// SelectData2()
// UpdateData()
// DeleteData()
InsertDataTransaction()
defer db.Close()
}
参考
【go笔记】使用sqlx操作MySQL的更多相关文章
- sqlx操作MySQL实战及其ORM原理
sqlx是Golang中的一个知名三方库,其为Go标准库database/sql提供了一组扩展支持.使用它可以方便的在数据行与Golang的结构体.映射和切片之间进行转换,从这个角度可以说它是一个OR ...
- python学习笔记十一:操作mysql
一.安装MySQL-python # yum install -y MySQL-python 二.打开数据库连接 #!/usr/bin/python import MySQLdb conn = MyS ...
- 【PHP+MySQL学习笔记】php操作MySQL数据库中语句
1.连接 MYSQL 服务器的函数 mysql_connect();<?php $con = mysql_connect("localhost","root&quo ...
- 笔记-python操作mysql
笔记-python操作mysql 1. 开始 1.1. 环境准备-mysql create database db_python; use db_python; create tabl ...
- 18 . Go之操作Mysql和sqlx使用
安装mysql wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm yum -y localinstall ...
- GO学习-(23) Go语言操作MySQL + 强大的sqlx
Go语言操作MySQL MySQL是业界常用的关系型数据库,本文介绍了Go语言如何操作MySQL数据库. Go操作MySQL 连接 Go语言中的database/sql包提供了保证SQL或类SQL数据 ...
- python学习笔记-(十六)python操作mysql
一. mysql安装 1. windows下安装mysql 1.1. 下载源: http://dev.mysql.com/downloads/installer/,请认准对应版本 Windows (x ...
- php笔记08:数据库编程---使用php的MySQL扩展库操作MySQL数据库
1.使用php的MySQL扩展库操作MySQL数据库: php有3种方式操作MySQL数据库 (1)mysql扩展库 (2)mysqli扩展库 (3)pdo mysql扩展库与mysql数据库 ...
- Java框架spring Boot学习笔记(五):Spring Boot操作MySQL数据库增、删、改、查
在pom.xml添加一下代码,添加操作MySQL的依赖jar包. <dependency> <groupId>org.springframework.boot</grou ...
- Java框架spring Boot学习笔记(四):Spring Boot操作MySQL数据库
在pom.xml添加一下代码,添加操作MySQL的依赖jar包. <dependency> <groupId>org.springframework.boot</grou ...
随机推荐
- SpringBoot定义优雅全局统一Restful API 响应框架四
如果没有看前面几篇文章请先看前面几篇 SpringBoot定义优雅全局统一Restful API 响应框架 SpringBoot定义优雅全局统一Restful API 响应框架二 SpringBoot ...
- 2023-03-01:用moonfdd/ffmpeg-go库,将h264文件编码为mp4文件。
2023-03-01:用moonfdd/ffmpeg-go库,将h264文件编码为mp4文件. 答案2023-03-01: 使用 github.com/moonfdd/ffmpeg-go 库.现在我们 ...
- values_list() 元组形式显示查询结果
values_list() 元组形式显示查询结果 name,age为数据库的两个列 Student.objects.values_list('name','age') values_list() 元组 ...
- flask之数据模型flask-sqlalchemy
一.安装数据库连接依赖包 pip install flask-sqlalchemy pip install pymysql 二.项目配置 app/__init__.py from flask_sqla ...
- 聊聊Seata分布式解决方案AT模式的实现原理
什么是Seata分布式事务解决方案 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.为用户提供了AT.TCC.SAGA和XA事务模式,为用户打造一站式的分布式解决 ...
- 《啊哈C语言——逻辑的挑战》学习笔记
第一章 梦想启航 第1节 让计算机开口说话 1.基础知识 1)计算机"说话"的两种方式 显示在屏幕上 通过喇叭发出声音 2)计算机"说话"之显示在屏幕上 格式: ...
- 2013年蓝桥杯C/C++大学A组省赛真题(振兴中华)
题目描述: 小明参加了学校的趣味运动会,其中的一个项目是:跳格子. 地上画着一些格子,每个格子里写一个字,如下所示: 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时,先站在左上角的写着&quo ...
- vue 一键导出数据为excel文件并附带样式 十分简单
自入行以来我就一直疑惑一个问题,导出excel为什么总是搞的很复杂,包括网上的教程,屎里淘金,非常耗费精力.今天刚好业务需要,整理一个简单明了的由vue前端导出的版本出来. 开始: #1.添加xlsx ...
- sqlmap工具学习
tryhackme:sqlmap github:https://github.com/sqlmapproject/sqlmap kali集成 参数介绍 sqlmap -h ___ __H__ ___ ...
- Python生成指定大小的文件
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/400bd75c.html 你好,我是测试蔡坨坨. 在日常测试工作中,我们经常需要对上传的文件大小进行测试,例如:一个文件上传 ...