首页 > 数据库 >golang使用sqlx操作MySQL

golang使用sqlx操作MySQL

时间:2023-01-29 14:35:48浏览次数:43  
标签:sqlx return err nil fmt Printf golang failed MySQL

 

package main

//sqlx示例

import (
    "errors"
    "fmt"

    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)

var DB *sqlx.DB

type User struct {
    ID   int    `db:"id"`
    Name string `db:"name"`
    Age  int    `db:"age"`
}

func initDB() (err error) {
    dsn := "user:password@tcp(xx.xx.xx.xx:3306)/go_db"
    DB, err = sqlx.Connect("mysql", dsn)
    if err != nil {
        return
    }
    return nil
}

//单条查询操作
func queryDemo() {
    sqlStr := "select id,name,age from info where id = ?"
    user := User{}
    err := DB.Get(&user, sqlStr, 1)
    if err != nil {
        fmt.Printf("query failed,err:%v\n", err)
        return
    }
    fmt.Printf("user:%#v\n", user)
    fmt.Printf("user:%v\n", user)
}

//查询多条
func queryMultiDemo() {
    sqlStr := "select id,name,age from info where id > ?"
    var users []User
    err := DB.Select(&users, sqlStr, 0)
    if err != nil {
        fmt.Println("query multi failed,err:%v\n", err)
        return
    }
    fmt.Printf("users: %v\n", users)
    for _, user := range users {
        fmt.Printf("user:%v\n", user)
    }
}

// 插入数据
func insertRowDemo() {
    sqlStr := "insert into info(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() // 新插入数据的id
    if 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 info set age=? where id = ?"
    ret, err := DB.Exec(sqlStr, 39, 1)
    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 deleteRowDemo() {
    sqlStr := "delete from info where id = ?"
    ret, err := DB.Exec(sqlStr, 1)
    if err != nil {
        fmt.Printf("delete 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("delete success, affected rows:%d\n", n)
}

//事务操作
func transDemo() {
    tx, err := DB.Beginx() //开启事务
    // tx.MustExec() //带Must的一般标识出错就直接panic
    if err != nil {
        if tx != nil {
            tx.Rollback()
        }
        fmt.Printf("begin trans failed,err:%v\n", err)
        return
    }
    sql1 := "update info set age=age-? where id=?"
    tx.MustExec(sql1, 2, 1)
    err = tx.Commit()
    if err != nil {
        tx.Rollback()
        fmt.Printf("commit failed,err:%v\n", err)
    }
    fmt.Println("数据更新成功")

}

//事务操作2
func transDemo2() (err error) {
    tx, err := DB.Beginx()
    if err != nil {
        fmt.Println("begin trans failed,err:", err)
        return
    }

    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p)
        } else if err != nil {
            fmt.Println("rollback")
            tx.Rollback()
        } else {
            err = tx.Commit()
            fmt.Println("sql commit")
        }
    }()

    sqlStr1 := "update info set age=99 where id = ?"
    r, err := tx.Exec(sqlStr1, 1)
    if err != nil {
        fmt.Println("sqlstr1执行失败,err:", err)
        return
    }
    n, err := r.RowsAffected()
    if err != nil {
        return
    }
    if n != 1 {
        return errors.New("exec sqlStr1 failed")
    }
    return err
}

func main() {
    err := initDB()
    if err != nil {
        fmt.Printf("init DB failed,err:%v\n", err)
        return
    }
    //查询单条
    // queryDemo()
    // queryMultiDemo()
    // insertRowDemo()
    // updateRowDemo()
    // transDemo()
    transDemo2()
}

 

package main
//sqlx示例
import (     "errors"     "fmt"
    _ "github.com/go-sql-driver/mysql"     "github.com/jmoiron/sqlx" )
var DB *sqlx.DB
type User struct {     ID   int    `db:"id"`     Name string `db:"name"`     Age  int    `db:"age"` }
func initDB() (err error) {     dsn := "TestVenus:xxxxxxxxx@tcp(172.23.102.xx:3306)/go_db"     DB, err = sqlx.Connect("mysql", dsn)     if err != nil {         return     }     return nil }
//单条查询操作 func queryDemo() {     sqlStr := "select id,name,age from info where id = ?"     user := User{}     err := DB.Get(&user, sqlStr, 1)     if err != nil {         fmt.Printf("query failed,err:%v\n", err)         return     }     fmt.Printf("user:%#v\n", user)     fmt.Printf("user:%v\n", user) }
//查询多条 func queryMultiDemo() {     sqlStr := "select id,name,age from info where id > ?"     var users []User     err := DB.Select(&users, sqlStr, 0)     if err != nil {         fmt.Println("query multi failed,err:%v\n", err)         return     }     fmt.Printf("users: %v\n", users)     for _, user := range users {         fmt.Printf("user:%v\n", user)     } }
// 插入数据 func insertRowDemo() {     sqlStr := "insert into info(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() // 新插入数据的id     if 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 info set age=? where id = ?"     ret, err := DB.Exec(sqlStr, 39, 1)     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 deleteRowDemo() {     sqlStr := "delete from info where id = ?"     ret, err := DB.Exec(sqlStr, 1)     if err != nil {         fmt.Printf("delete 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("delete success, affected rows:%d\n", n) }
//事务操作 func transDemo() {     tx, err := DB.Beginx() //开启事务     // tx.MustExec() //带Must的一般标识出错就直接panic     if err != nil {         if tx != nil {             tx.Rollback()         }         fmt.Printf("begin trans failed,err:%v\n", err)         return     }     sql1 := "update info set age=age-? where id=?"     tx.MustExec(sql1, 2, 1)     err = tx.Commit()     if err != nil {         tx.Rollback()         fmt.Printf("commit failed,err:%v\n", err)     }     fmt.Println("数据更新成功")
}
//事务操作2 func transDemo2() (err error) {     tx, err := DB.Beginx()     if err != nil {         fmt.Println("begin trans failed,err:", err)         return     }
    defer func() {         if p := recover(); p != nil {             tx.Rollback()             panic(p)         } else if err != nil {             fmt.Println("rollback")             tx.Rollback()         } else {             err = tx.Commit()             fmt.Println("sql commit")         }     }()
    sqlStr1 := "update info set age=99 where id = ?"     r, err := tx.Exec(sqlStr1, 1)     if err != nil {         fmt.Println("sqlstr1执行失败,err:", err)         return     }     n, err := r.RowsAffected()     if err != nil {         return     }     if n != 1 {         return errors.New("exec sqlStr1 failed")     }     return err }
func main() {     err := initDB()     if err != nil {         fmt.Printf("init DB failed,err:%v\n", err)         return     }     //查询单条     // queryDemo()     // queryMultiDemo()     // insertRowDemo()     // updateRowDemo()     // transDemo()     transDemo2() }

标签:sqlx,return,err,nil,fmt,Printf,golang,failed,MySQL
From: https://www.cnblogs.com/wushaoyu/p/16519204.html

相关文章

  • golang连接操作mysql
    golang操作mysqlpackagemainimport("database/sql""fmt""time"_"github.com/go-sql-driver/mysql")//定义一个全局db对象vardb*sql.DB......
  • linux-安装mysql
    1.在/use/local下mkdirmysql  2.切换到mysql文件夹下cdmysql  3.下载mysql wgethttps://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-lin......
  • mysql8.0 --mysqldump数据备份
     mysqldump数据,可以把用户名写在配置文件的[mysqldump]中但是这里只能写一个用户名和密码,如果一个数据库里有多个用户和数据库怎么分开备份。1、创建一个备份的用户test......
  • 关于Mysql中str_to_date函数
    Str_To_Date(str,format):提供2个参数,Str是字符串时间,年:月:日时:分:秒的值,format是设置什么日期格式的条件。一般都会自动写代码显示selectStr_To_Date(now(),'%Y-%m-%d......
  • 电脑本地安装不同版本MySQL
    本地已经安装了mysql5.7版本,想测试mysql8版本的用法,想在一台电脑同时配置不同版本的mysql在不同端口号,看起来简单,实现起来其实挺多坑的,总结下实战经验和大家分享下......
  • docker安装Mysql5.7
    Linuxdocker安装Mysql1.docker镜像地址配置vim/etc/docker/daemon.json2.加入配置信息{"registry-mirrors":["https://wghlmi3i.mirror.aliyuncs.com","https://d......
  • MySQL基础:通过SQL对数据库进行CRUD
    MySQL基础今日目标:能通过SQL对数据库进行CRUD文章目录MySQL基础一、MySQL数据模型二、SQL概述2.1SQL简介2.2通用语法2.3SQL分类三、DDL:操作数据库3.1查询3.2创建数据......
  • MySql IN 和 EXISTS 的区别
    一、in关键字确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比......
  • MySql多字段大表的优化方法
    主从同步+读写分离:这个表在有设备条件的情况下,读写分离,这样能减少很多压力,而且数据稳定性也能提高纵向分表:根据原则,每个表最多不要超过5个索引,纵向拆分字段,将部分......
  • golang并发编程-生产者消费者模式
    https://blog.csdn.net/qq_55752792/article/details/125917846packagemainimport("fmt""math/rand""sync""time")//JobstructtypeJobst......