go操作mysql(原生database/sql, sqlx库)GORM
GORM官网地址:
GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
参考:
Go语言操作MySQL | 李文周的博客
安装:
go get -u github.com/go-sql-driver/mysql
示例:
package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)// go get -u github.com/go-sql-driver/mysql// 定义一个全局对象db
var db *sql.DB// 定义一个初始化数据库的函数
func initDB() (err error) {// DSN:Data Source Namedsn := "user:pwd@tcp(127.0.0.1:3306)/db_name?charset=utf8mb4&parseTime=True"// 不会校验账号密码是否正确// 注意!!!这里不要使用:=,我们是给全局变量赋值,然后在main函数中使用全局变量dbdb, err = sql.Open("mysql", dsn)if err != nil {return err}// 尝试与数据库建立连接(校验dsn是否正确)err = db.Ping()if err != nil {return err}return nil
}type user struct {id stringname_cn stringname_en string
}// 查询单条数据示例
func queryRowDemo() {sqlStr := "select id, name_cn, name_en from asset_type"var u user// 非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放err := db.QueryRow(sqlStr).Scan(&u.id, &u.name_cn, &u.name_en)if err != nil {fmt.Printf("scan failed, err:%v\n", err)return}fmt.Printf("id:%s name_cn:%s name_en:%s\n", u.id, u.name_cn, u.name_en)
}// 查询多条
func queryRows() {sqlStr := "SELECT id, name_cn, name_en from asset_type"rows, err := db.Query(sqlStr)if err != nil {fmt.Printf("query failed, err:%v\n", err)return}// 非常重要:关闭rows释放持有的数据库链接defer rows.Close()for rows.Next() {var u usererr := rows.Scan(&u.id, &u.name_cn, &u.name_en)if err != nil {fmt.Printf("scan failed, err:%v\n", err)return}fmt.Printf("id:%s name_cn:%s name_en:%s\n", u.id, u.name_cn, u.name_en)}
}// 插入数据
func insertRowDemo() {sqlStr := "insert into user(name, age) values (?,?)"ret, err := db.Exec(sqlStr, "王五", 38)if err != nil {fmt.Printf("insert failed, err:%v\n", err)return}theID, err := ret.LastInsertId() // 新插入数据的idif err != nil {fmt.Printf("get lastinsert ID failed, err:%v\n", err)return}fmt.Printf("insert success, the id is %d.\n", theID)
}// 预处理插入示例
func prepareInsertDemo() {sqlStr := "insert into user(name, age) values (?,?)"stmt, err := db.Prepare(sqlStr)if err != nil {fmt.Printf("prepare failed, err:%v\n", err)return}defer stmt.Close()_, err = stmt.Exec("小王子", 18)if err != nil {fmt.Printf("insert failed, err:%v\n", err)return}_, err = stmt.Exec("沙河娜扎", 18)if err != nil {fmt.Printf("insert failed, err:%v\n", err)return}fmt.Println("insert success.")
}// 事务操作示例
func transactionDemo() {tx, err := db.Begin() // 开启事务if err != nil {if tx != nil {tx.Rollback() // 回滚}fmt.Printf("begin trans failed, err:%v\n", err)return}sqlStr1 := "Update user set age=30 where id=?"ret1, err := tx.Exec(sqlStr1, 2)if err != nil {tx.Rollback() // 回滚fmt.Printf("exec sql1 failed, err:%v\n", err)return}affRow1, err := ret1.RowsAffected()if err != nil {tx.Rollback() // 回滚fmt.Printf("exec ret1.RowsAffected() failed, err:%v\n", err)return}sqlStr2 := "Update user set age=40 where id=?"ret2, err := tx.Exec(sqlStr2, 3)if err != nil {tx.Rollback() // 回滚fmt.Printf("exec sql2 failed, err:%v\n", err)return}affRow2, err := ret2.RowsAffected()if err != nil {tx.Rollback() // 回滚fmt.Printf("exec ret1.RowsAffected() failed, err:%v\n", err)return}fmt.Println(affRow1, affRow2)if affRow1 == 1 && affRow2 == 1 {fmt.Println("事务提交啦...")tx.Commit() // 提交事务} else {tx.Rollback()fmt.Println("事务回滚啦...")}fmt.Println("exec trans success!")
}func main() {err := initDB() // 调用输出化数据库的函数if err != nil {fmt.Printf("init db failed,err:%v\n", err)return}// queryRowDemo()queryRows()
}
sqlx库
安装:go get github.com/jmoiron/sqlx
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx"
)var db *sqlx.DBtype user struct {ID intAccount stringRole string
}func initDB() (err error) {dsn := "root:Mjolnir@tcp(127.0.0.1:3306)/assess?charset=utf8mb4&parseTime=True"// 也可以使用MustConnect连接不成功就panicdb, err = sqlx.Connect("mysql", dsn)if err != nil {fmt.Printf("connect DB failed, err:%v\n", err)return}db.SetMaxOpenConns(20)db.SetMaxIdleConns(10)return
}// 查询单条数据示例
func queryRowDemo() {sqlStr := "select id, account, role from user where id=?"var u usererr := db.Get(&u, sqlStr, 1)if err != nil {fmt.Printf("get failed, err:%v\n", err)return}fmt.Printf("id:%d name:%s role:%s\n", u.ID, u.Account, u.Role)
}// 查询多条数据示例
func queryMultiRowDemo() {sqlStr := "select id, account, role from user where id > ?"var users []usererr := db.Select(&users, sqlStr, 0)if err != nil {fmt.Printf("query failed, err:%v\n", err)return}fmt.Printf("users:%#v\n", users)
}// sqlx中的exec方法与原生sql中的exec使用基本一致:
// 插入数据
func insertRowDemo() {sqlStr := "insert into user(name, age) values (?,?)"ret, err := db.Exec(sqlStr, "沙河小王子", 19)if err != nil {fmt.Printf("insert failed, err:%v\n", err)return}theID, err := ret.LastInsertId() // 新插入数据的idif err != nil {fmt.Printf("get lastinsert ID failed, err:%v\n", err)return}fmt.Printf("insert success, the id is %d.\n", theID)
}// 更新数据
func updateRowDemo() {sqlStr := "update user set age=? where id = ?"ret, err := db.Exec(sqlStr, 39, 6)if err != nil {fmt.Printf("update failed, err:%v\n", err)return}n, err := ret.RowsAffected() // 操作影响的行数if err != nil {fmt.Printf("get RowsAffected failed, err:%v\n", err)return}fmt.Printf("update success, affected rows:%d\n", n)
}//删除示例
func deleteDemo() {sqlStr := "delete from user where id=?"ret, err := db.Exec(sqlStr, 10)if err != nil {fmt.Printf("delete failed, err:%v\n", err)return}n, err := ret.RowsAffected()if err != nil {fmt.Printf("get rows affected failed, err:%v\n", err)return}fmt.Printf("delete success, affected rows:%d\n", n)
}// 事务操作:对于事务操作,我们可以使用sqlx中提供的db.Beginx()和tx.Exec()方法。示例代码如下
func transactionDemo2()(err error) {tx, err := db.Beginx() // 开启事务if err != nil {fmt.Printf("begin trans failed, err:%v\n", err)return err}defer func() {if p := recover(); p != nil {tx.Rollback()panic(p) // re-throw panic after Rollback} else if err != nil {fmt.Println("rollback")tx.Rollback() // err is non-nil; don't change it} else {err = tx.Commit() // err is nil; if Commit returns error update errfmt.Println("commit")}}()sqlStr1 := "Update user set age=20 where id=?"rs, err := tx.Exec(sqlStr1, 1)if err!= nil{return err}n, err := rs.RowsAffected()if err != nil {return err}if n != 1 {return errors.New("exec sqlStr1 failed")}sqlStr2 := "Update user set age=50 where i=?"rs, err = tx.Exec(sqlStr2, 5)if err!=nil{return err}n, err = rs.RowsAffected()if err != nil {return err}if n != 1 {return errors.New("exec sqlStr1 failed")}return err
}func main() {initDB()queryRowDemo()queryMultiRowDemo()
}
go操作mysql(原生database/sql, sqlx库)GORM相关推荐
- python mysql倒序_day40:MySQL:python操作mysql:pymysql模块SQL注入攻击
目录 part1:用python连接mysql 1.用python连接mysql的基本语法 创建连接conn→创建游标对象cursor→执行sql语句execute→获取数据fetchone→释放游标 ...
- sql操作mysql数据库_一些常用的操作MySQL数据库的sql语句
创建数据库:create database 数据库名; 删除数据库:drop datebase 数据库名; 查看数据库:show databases;(所有数据库) 使用数据库:use 数据库名;(之 ...
- 操作MySQL数据库的sql语句是否区分大小写?
楼主博客已迁移至Junlan Shuai'Blog MySQL数据库中的sql语句是否区分大小写,在不同的操作系统中表现不同. 一.在windows系统中不区分大小写: "SELECT * ...
- 如何管理和使用哪些命令操作MySQL数据库?(基本操作,SQL语言,DDL,DML,DQL,DCL,Windows字符和图形界面MySQL安装)
文章目录 前言 一:数据库基本操作命令 1.1:MySQL常用管理操作是哪些? 1.2:查看数据库列表信息的命令是? 1.3:查看数据库中的数据表信息命令是? 1.4:显示数据表的结构(字段)命令是? ...
- Go语言教程第十二集 操作mysql和redis
1.Go操作MySQL数据库 前言 常见的数据库有 SqlLite MySQL SQLServer postgreSQL Oracle MySQL主流的关系型数据库,类似的还有postgreSQL 关 ...
- Go语言操作MySQL
MySQL是业界常用的关系型数据库,本文介绍了Go语言如何操作MySQL数据库. Go操作MySQL 连接 Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具 ...
- ·MySQL数据库管理(SQL操作命令,解决忘记密码,设置用户权限)
文章目录 数据库基本操作命令 MySQL查看当前服务器中包含的库 查看当前使用的库中包含的表 显示数据表的结构(字段)命令 SQL操作管理命令 DDL操作命令 DDL语句创建库,表的命令 DDL语句删 ...
- 用Python操作MySQL(pymysql)
用python来操作MySQL,首先需要安装PyMySQL库(pip install pymysql). 连接MySQL: import pymysql connect=pymysql.connect ...
- mysql escape python_Python 操作 MYSQL
本文介绍了 Python 操作 MYSQL.执行 SQL 语句.获取结果集.遍历结果集.取得某个字 段.获取表字段名.将图片插入数据库.执行事务等各种代码实例和详细介绍,代码居多, 是一桌丰盛唯美的代 ...
最新文章
- python流程控制-Python流程控制
- ACM中出现RuntimeError的原因及可能的解决办法
- $ppclass php,jquery weui
- web 开发之js---js 实现文本高亮
- java反编译工具jd-gui下载与使用
- 波轮全自动洗衣机分解与典型部件拆装技巧
- MySQL之环境变量配置
- 为什么恢复后的文件打不开?U盘数据恢复常见问题
- 程序员在国外:在加拿大IT公司工作三年的一些感受
- 分享5个爬虫专业博客网站
- Linux开机启动过程-centos7
- Swagger简单使用之从入门到精通
- 父类(指针、引用)指向子类对象
- 增长黑客AB-Test系统(三)——AB-Test Hash分流
- c语言:求两个数的最大公约数与最小公倍数
- 开源不只用来玩,“拿来主义”遭唾弃
- Vue.js入门学习--列表渲染--v-for遍历数组生成元素(四)
- 运行fis3 server start --type smarty启动时,报错The “data“ argument must be of type string or an instance of
- 多道批处理系统、分时操作系统
- 全新Pervasive SQL Summit V10数据库
热门文章
- 吴恩达2022机器学习——第二部分高级学习算法第二周笔记
- 程序猿敲击代码的指法推荐
- oracle 如何备份.bak,Oracle备份如何到异机还原
- Python 使用PIL.Image制作一个运动小人的动态图
- 报错 SparkContext is null but app is still running!
- python爬虫小项目: 爬取百度贴吧帖子
- MySQL的安装(最新版本)(二)
- 计算机软件商标,计算机软件商标的类别号 是多少?
- 容联云2020年营收近8亿:亏损5亿,上市45天市值回到起点
- Marvolo Gaunt's Ring 【CodeForces 855B】