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相关推荐

  1. python mysql倒序_day40:MySQL:python操作mysql:pymysql模块SQL注入攻击

    目录 part1:用python连接mysql 1.用python连接mysql的基本语法 创建连接conn→创建游标对象cursor→执行sql语句execute→获取数据fetchone→释放游标 ...

  2. sql操作mysql数据库_一些常用的操作MySQL数据库的sql语句

    创建数据库:create database 数据库名; 删除数据库:drop datebase 数据库名; 查看数据库:show databases;(所有数据库) 使用数据库:use 数据库名;(之 ...

  3. 操作MySQL数据库的sql语句是否区分大小写?

    楼主博客已迁移至Junlan Shuai'Blog MySQL数据库中的sql语句是否区分大小写,在不同的操作系统中表现不同. 一.在windows系统中不区分大小写: "SELECT * ...

  4. 如何管理和使用哪些命令操作MySQL数据库?(基本操作,SQL语言,DDL,DML,DQL,DCL,Windows字符和图形界面MySQL安装)

    文章目录 前言 一:数据库基本操作命令 1.1:MySQL常用管理操作是哪些? 1.2:查看数据库列表信息的命令是? 1.3:查看数据库中的数据表信息命令是? 1.4:显示数据表的结构(字段)命令是? ...

  5. Go语言教程第十二集 操作mysql和redis

    1.Go操作MySQL数据库 前言 常见的数据库有 SqlLite MySQL SQLServer postgreSQL Oracle MySQL主流的关系型数据库,类似的还有postgreSQL 关 ...

  6. Go语言操作MySQL

    MySQL是业界常用的关系型数据库,本文介绍了Go语言如何操作MySQL数据库. Go操作MySQL 连接 Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具 ...

  7. ·MySQL数据库管理(SQL操作命令,解决忘记密码,设置用户权限)

    文章目录 数据库基本操作命令 MySQL查看当前服务器中包含的库 查看当前使用的库中包含的表 显示数据表的结构(字段)命令 SQL操作管理命令 DDL操作命令 DDL语句创建库,表的命令 DDL语句删 ...

  8. 用Python操作MySQL(pymysql)

    用python来操作MySQL,首先需要安装PyMySQL库(pip install pymysql). 连接MySQL: import pymysql connect=pymysql.connect ...

  9. mysql escape python_Python 操作 MYSQL

    本文介绍了 Python 操作 MYSQL.执行 SQL 语句.获取结果集.遍历结果集.取得某个字 段.获取表字段名.将图片插入数据库.执行事务等各种代码实例和详细介绍,代码居多, 是一桌丰盛唯美的代 ...

最新文章

  1. python流程控制-Python流程控制
  2. ACM中出现RuntimeError的原因及可能的解决办法
  3. $ppclass php,jquery weui
  4. web 开发之js---js 实现文本高亮
  5. java反编译工具jd-gui下载与使用
  6. 波轮全自动洗衣机分解与典型部件拆装技巧
  7. MySQL之环境变量配置
  8. 为什么恢复后的文件打不开?U盘数据恢复常见问题
  9. 程序员在国外:在加拿大IT公司工作三年的一些感受
  10. 分享5个爬虫专业博客网站
  11. Linux开机启动过程-centos7
  12. Swagger简单使用之从入门到精通
  13. 父类(指针、引用)指向子类对象
  14. 增长黑客AB-Test系统(三)——AB-Test Hash分流
  15. c语言:求两个数的最大公约数与最小公倍数
  16. 开源不只用来玩,“拿来主义”遭唾弃
  17. Vue.js入门学习--列表渲染--v-for遍历数组生成元素(四)
  18. 运行fis3 server start --type smarty启动时,报错The “data“ argument must be of type string or an instance of
  19. 多道批处理系统、分时操作系统
  20. 全新Pervasive SQL Summit V10数据库

热门文章

  1. 吴恩达2022机器学习——第二部分高级学习算法第二周笔记
  2. 程序猿敲击代码的指法推荐
  3. oracle 如何备份.bak,Oracle备份如何到异机还原
  4. Python 使用PIL.Image制作一个运动小人的动态图
  5. 报错 SparkContext is null but app is still running!
  6. python爬虫小项目: 爬取百度贴吧帖子
  7. MySQL的安装(最新版本)(二)
  8. 计算机软件商标,计算机软件商标的类别号 是多少?
  9. 容联云2020年营收近8亿:亏损5亿,上市45天市值回到起点
  10. Marvolo Gaunt's Ring 【CodeForces 855B】