zoukankan      html  css  js  c++  java
  • mysql_example

    package main
    
    import (
        "database/sql"
        "fmt"
    
        _ "github.com/go-sql-driver/mysql"
    )
    
    var DB *sql.DB
    
    func initDb() error {
        var err error
        dsn := "root:root@tcp(localhost:3306)/golang_db"
        DB, err = sql.Open("mysql", dsn)
        if err != nil {
            return err
        }
    
        DB.SetMaxOpenConns(100)
        DB.SetMaxIdleConns(16)
        return nil
    }
    
    type User struct {
        Id   int64          `db:"id"`
        Name sql.NullString `db:"string"`
        Age  int            `db:"age"`
    }
    
    func testQueryMultilRow() {
        sqlstr := "select id, name, age from user where id > ?"
        rows, err := DB.Query(sqlstr, 0)
        //重点关注, rows对象一定要close掉
        defer func() {
            if rows != nil {
                rows.Close()
            }
        }()
    
        if err != nil {
            fmt.Printf("query failed, err:%v
    ", err)
            return
        }
    
        for rows.Next() {
            var user User
            err := rows.Scan(&user.Id, &user.Name, &user.Age)
            if err != nil {
                fmt.Printf("scan failed, err:%v
    ", err)
                return
            }
            fmt.Printf("user:%#v
    ", user)
        }
    
    }
    
    func testQueryData() {
        for i := 0; i < 101; i++ {
            fmt.Printf("query %d times
    ", i)
            sqlstr := "select id, name, age from user where id=?"
            row := DB.QueryRow(sqlstr, 2)
            /*if row != nil {
                continue
            }*/
            var user User
            err := row.Scan(&user.Id, &user.Name, &user.Age)
            if err != nil {
                fmt.Printf("scan failed, err:%v
    ", err)
                return
            }
    
            fmt.Printf("id:%d name:%v age:%d
    ", user.Id, user.Name, user.Age)
        }
    
    }
    
    func testInsertData() {
        sqlstr := "insert into user(name, age) values(?, ?)"
        result, err := DB.Exec(sqlstr, "tom", 18)
        if err != nil {
            fmt.Printf("insert failed, err:%v
    ", err)
            return
        }
    
        id, err := result.LastInsertId()
        if err != nil {
            fmt.Printf("get last insert id failed, err:%v
    ", err)
            return
        }
        fmt.Printf("id is %d
    ", id)
    }
    
    func testUpdateData() {
        sqlstr := "update user set name=? where id=?"
        result, err := DB.Exec(sqlstr, "jim", 3)
        if err != nil {
            fmt.Printf("insert failed, err:%v
    ", err)
            return
        }
    
        affected, err := result.RowsAffected()
        if err != nil {
            fmt.Printf("get affected rows failed, err:%v
    ", err)
        }
        fmt.Printf("update db succ, affected rows:%d
    ", affected)
    }
    
    func testDeleteData() {
        sqlstr := "delete from user where id=?"
        result, err := DB.Exec(sqlstr, 3)
        if err != nil {
            fmt.Printf("insert failed, err:%v
    ", err)
            return
        }
    
        affected, err := result.RowsAffected()
        if err != nil {
            fmt.Printf("get affected rows failed, err:%v
    ", err)
        }
        fmt.Printf("delete db succ, affected rows:%d
    ", affected)
    }
    
    func testPrepareData() {
        sqlstr := "select id, name, age from user where id > ?"
        stmt, err := DB.Prepare(sqlstr)
        if err != nil {
            fmt.Printf("prepare failed, err:%v
    ", err)
            return
        }
    
        defer func() {
            if stmt != nil {
                stmt.Close()
            }
        }()
    
        rows, err := stmt.Query(0)
        //重点关注, rows对象一定要close掉
        defer func() {
            if rows != nil {
                rows.Close()
            }
        }()
    
        if err != nil {
            fmt.Printf("query failed, err:%v
    ", err)
            return
        }
    
        for rows.Next() {
            var user User
            err := rows.Scan(&user.Id, &user.Name, &user.Age)
            if err != nil {
                fmt.Printf("scan failed, err:%v
    ", err)
                return
            }
            fmt.Printf("user:%#v
    ", user)
        }
    }
    
    func testPrepareInsertData() {
        sqlstr := "insert into user(name, age) values(?, ?)"
        stmt, err := DB.Prepare(sqlstr)
        if err != nil {
            fmt.Printf("insert failed, err:%v
    ", err)
            return
        }
    
        defer func() {
            if stmt != nil {
                stmt.Close()
            }
        }()
        result, err := stmt.Exec("jim", 100)
        id, err := result.LastInsertId()
        if err != nil {
            fmt.Printf("get last insert id failed, err:%v
    ", err)
            return
        }
        fmt.Printf("id is %d
    ", id)
    }
    
    func testTrans() {
    
        conn, err := DB.Begin()
        if err != nil {
            if conn != nil {
                conn.Rollback()
            }
            fmt.Printf("begin failed, err:%v
    ", err)
            return
        }
    
        sqlstr := "update user set age = 1 where id = ?"
        _, err = conn.Exec(sqlstr, 1)
        if err != nil {
            conn.Rollback()
            fmt.Printf("exec sql:%s failed, err:%v
    ", sqlstr, err)
            return
        }
    
        sqlstr = "update user set age = 2 where id = ?"
        _, err = conn.Exec(sqlstr, 2)
        if err != nil {
            conn.Rollback()
            fmt.Printf("exec second sql:%s failed, err:%v
    ", sqlstr, err)
            return
        }
        err = conn.Commit()
        if err != nil {
            fmt.Printf("commit failed, err:%v
    ", err)
            conn.Rollback()
            return
        }
    }
    
    func main() {
        err := initDb()
        if err != nil {
            fmt.Printf("init db failed, err:%v
    ", err)
            return
        }
    
        //testQueryData()
        //testQueryMultilRow()
        //testInsertData()
        //testUpdateData()
        //testDeleteData()
        //testPrepareData()
        //testPrepareInsertData()
        testTrans()
    }
    package main
    
    import (
        "database/sql"
        "fmt"
    
        _ "github.com/go-sql-driver/mysql"
        "github.com/jmoiron/sqlx"
    )
    
    var DB *sqlx.DB
    
    func initDb() error {
        var err error
        dsn := "root:root@tcp(localhost:3306)/golang_db"
        DB, err = sqlx.Open("mysql", dsn)
        if err != nil {
            return err
        }
    
        DB.SetMaxOpenConns(100)
        DB.SetMaxIdleConns(16)
        return nil
    }
    
    type User struct {
        Id   int64          `db:"id"`
        Name sql.NullString `db:"name"`
        Age  int            `db:"age"`
    }
    
    func testQuery() {
        sqlstr := "select id, name, age from user where id=?"
        var user User
    
        err := DB.Get(&user, sqlstr, 2)
        if err != nil {
            fmt.Printf("get failed, err:%v
    ", err)
            return
        }
    
        fmt.Printf("user:%#v
    ", user)
    }
    
    func testQueryMulti() {
        sqlstr := "select id, name, age from user where id>?"
        var user []User
    
        err := DB.Select(&user, sqlstr, 1)
        if err != nil {
            fmt.Printf("get failed, err:%v
    ", err)
            return
        }
    
        fmt.Printf("user:%#v
    ", user)
    }
    
    func testUpdate() {
        sqlstr := "update user set name=? where id=?"
        result, err := DB.Exec(sqlstr, "abc", 1)
        if err != nil {
            fmt.Printf("update failed, err:%v
    ", err)
            return
        }
        count, err := result.RowsAffected()
        if err != nil {
            fmt.Printf("affected rows failed, err:%v
    ", err)
            return
        }
        fmt.Printf("affect rows:%d
    ", count)
    }
    
    func queryDB(name string) {
        sqlstr := fmt.Sprintf("select id, name, age from user where name='%s'", name)
        fmt.Printf("sql:%s
    ", sqlstr)
        var user []User
        err := DB.Select(&user, sqlstr)
        if err != nil {
            fmt.Printf("select failed, err:%v
    ", err)
            return
        }
    
        for _, v := range user {
            fmt.Printf("user:%#v
    ", v)
        }
    }
    
    func queryDBBySqlx(name string) {
        sqlstr := "select id, name, age from user where name=?"
        //fmt.Printf("sql:%s
    ", sqlstr)
        var user []User
        err := DB.Select(&user, sqlstr, name)
        if err != nil {
            fmt.Printf("select failed, err:%v
    ", err)
            return
        }
    
        for _, v := range user {
            fmt.Printf("user:%#v
    ", v)
        }
    }
    
    func testSqlInject() {
        //queryDB("abc' or 1 = 1 #")
        //queryDB("name=abc' and (select count(*) from user ) < 10#")
        //queryDB("name=123' union select *from user #")
        queryDBBySqlx("name=123' union select *from user #")
    }
    
    func main() {
    
        err := initDb()
        if err != nil {
            fmt.Printf("init db failed, err:%v
    ", err)
            return
        }
    
        //testQuery()
        //testQueryMulti()
        //testUpdate()
        testSqlInject()
    }
  • 相关阅读:
    B站开源播放框架ijkplayer(iOS版)使用教程
    GitHub前50名的Objective-C动画相关库
    iOS系统自带的 UIAlertView 自动旋转的实现
    iOSAPP启动时实现加载广告
    每周分享第5期(2019.5.4)
    如何为Redis中list中的项设置过期时间
    对scrapy进行单元测试 -- 使用betamax
    【AMAD】betamax -- 一个ruby-VCR的模仿品,只支持requests
    【AMAD】stackprint -- 为Python加入利于调试的traceback信息
    【AMAD】Pysnooper -- 别再用print进行debug了
  • 原文地址:https://www.cnblogs.com/sunlong88/p/11723178.html
Copyright © 2011-2022 走看看