设为首页 收藏本站
查看: 781|回复: 0

[经验分享] Go语言中mysql数据库操作(一)

[复制链接]

尚未签到

发表于 2018-10-1 14:43:37 | 显示全部楼层 |阅读模式
package main  import (
  "database/sql"
  _"github.com/go-sql-driver/mysql" // 这里很重要,导入自己本地使用的数据库驱动,前面是下划线,否则会报错:sql: unknown driver "mysql" (forgotten import?)
  "fmt"
  "strings"
  "github.com/jmoiron/sqlx"
  )
  func main() {
  // 连接数据库,用户名:密码@协议(地址:端口)/数据库?参数=参数值,常用"用户名:密码@tcp(ip:端口)/数据库名?charset=字符集"
  db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/betting?charset=utf8")
  errDeal("连接数据库", err)
  defer db.Close()
  //=========================================================================================增删改
  // 插入数据---------------------方法1
  result, err := db.Exec("INSERT INTO admin_log(admin_username,log_time,log_ip,log_type,log_desc)" +
  " VALUES(?,now(),?,?,?)", "admin", "127.0.0.1", "登录", "登录成功")
  errDeal("插入数据", err)
  // 查看返回信息
  count, err := result.RowsAffected()
  errDeal("查看插入数据条数", err)
  fmt.Printf("插入数据条数:%d\n", count)
  id, err := result.LastInsertId()
  errDeal("查看最后插入数据的id", err)

  fmt.Printf("最后插入数据的id:%d\n",>  // 插入数据---------------------方法2,先创建一个预处理语句,再执行
  stmt, err := db.Prepare("INSERT INTO admin_log(admin_username,log_time,log_ip,log_type,log_desc)" +
  " VALUES(?,now(),?,?,?)")
  result1, err1 := stmt.Exec("admin", "127.0.0.1", "登录", "登录成功")
  errDeal("方法2插入数据", err1)
  fmt.Println(result1.LastInsertId())
  // 删除数据

  result2, err := db.Exec("DELETE FROM admin_log WHERE>  fmt.Println(result2.RowsAffected())
  // 更新数据

  result3, err := db.Exec("UPDATE admin_log SET log_ip=? WHERE>  fmt.Println(result3.RowsAffected())
  //=============================================================================================查询
  // 查询单条数据
  // 先定义存储查询结果的变量
  var rid int
  var username, time, ip, logType string
  var desc, remark, spare interface{} // 如果字段中可能出现值为nil的情况,可以将变量申明为interface{}类型

  err2 := db.QueryRow("SELECT>
  " FROM admin_log WHERE>  errDeal("查询单条数据", err2)
  fmt.Printf("id=%d,username=%s,time=%s,ip=%s,logType=%s,desc=%s,remark=%v,spare=%v\n", rid, username, time, ip, logType, desc, remark, spare)
  // 查询多条数据
  rows, err3 := db.Query("SELECT admin_username,log_time,log_ip,log_type,log_desc" +

  " FROM admin_log WHERE>  errDeal("查询多条数据", err3)
  // 对多条数据进行遍历
  for rows.Next() {
  err4 := rows.Scan(&username, &time, &ip, &logType, &desc)
  errDeal("遍历多条数据", err4)
  fmt.Printf("username=%s,time=%s,ip=%s,logType=%s,desc=%s\n", username, time, ip, logType, desc)
  }
  // 如果查询中不指定具体字段,使用*
  rows, err33 := db.Query("SELECT *" +

  " FROM admin_log WHERE>  errDeal("查询多条数据", err33)
  // 查询所有字段名,返回string切片
  columes, err333 := rows.Columns()
  errDeal("rows.Columns()方法调用", err333)
  fmt.Printf("%T----%v\n", columes, columes)
  var scanColumes = make([]interface{}, len(columes))
  var values = make([]interface{}, len(columes))
  for index, _ := range  scanColumes {
  scanColumes[index] = &values[index]
  }
  for rows.Next() {
  err4 := rows.Scan(scanColumes...)
  errDeal("遍历多条数据", err4)
  for i, val := range values {
  if strings.EqualFold(checkType(val), "[]uint8") {
  fmt.Printf("%s(%T)==%s\t", columes, val, val)
  } else {
  fmt.Printf("%s(%T)==%v\t", columes, val, val)
  }
  }
  fmt.Println()
  }
  // ==================================================================================================事务
  // 开启事务,tx是从连接池中取出一个连接,在关闭之前都是使用这个连接,提交事务和回滚事务都是操作tx
  tx, err5 := db.Begin()
  errDeal("开启事务", err5)

  _, err6 := tx.Exec("UPDATE admin_log SET log_desc=? WHERE>  //if err6 != nil {
  if err6 == nil {
  tx.Rollback() // 回滚
  }
  tx.Commit() // 提交
  // 批量数据插入
  tx, err7 := db.Begin()
  errDeal("数据批量插入,开启事务", err7)
  insertValues := [][]interface{}{{"admin", "127.0.0.1", "登录", "登录成功"},{"admin", "127.0.0.1", "删除", "删除数据"},{"admin", "127.0.0.1", "退出", "退出系统"}}
  stmt, err8 := tx.Prepare("INSERT INTO admin_log(admin_username,log_time,log_ip,log_type,log_desc) VALUES(?,now(),?,?,?)")
  errDeal("数据批量插入,预处理", err8)
  defer stmt.Close()
  // 通过循环将每条SQL的参数写到目标表缓冲区。
  for _, val := range  insertValues {
  _, err := stmt.Exec(val...)
  if err != nil {
  fmt.Printf("出现错误回滚,错误信息:%v", err)
  tx.Rollback()
  }
  }
  tx.Commit()
  // 使用sqlx批量数据插入
  xdb, err9 := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/betting?charset=utf8")
  errDeal("sqlx连接数据库", err9)
  defer xdb.close()
  txx, err10 := xdb.Beginx()
  errDeal("sqlx开启事务", err10)
  insertValuesx := [][]interface{}{{"admin", "127.0.0.1", "登录", "登录成功X"},{"admin", "127.0.0.1", "删除", "删除数据X"},{"admin", "127.0.0.1", "退出", "退出系统X"}}
  stmtx, err11 := txx.Preparex("INSERT INTO admin_log(admin_username,log_time,log_ip,log_type,log_desc) VALUES(?,now(),?,?,?)")
  errDeal("数据批量插入,预处理", err11)
  defer stmtx.Close()
  // 通过循环将每条SQL的参数写到目标表缓冲区。
  for _, val := range insertValuesx {
  _, err := stmtx.Exec(val...)
  if err != nil {
  fmt.Printf("sqlx出现错误回滚,错误信息:%v", err)
  txx.Rollback()
  }
  }
  txx.Commit()
  }
  func errDeal(info string, err error) {
  if err != nil {
  panic(fmt.Sprintf("%s,错误信息:%v", info, err))
  }
  }
  func checkType(val interface{}) string {
  switch val.(type) {
  case []uint8 :
  return "[]uint8"
  }
  return ""
  }


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-607231-1-1.html 上篇帖子: MySQL binlog 下篇帖子: Centos6.5 安装 JDK +tomcat +mysql 安装教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表