gobox中mysql操作

作者: ligang1109 | 来源:发表于2018-07-21 10:19 被阅读5次

今天来说下使用gobox中mysql操作相关

说明

本包的driver部分使用了go-sql-driver:https://github.com/go-sql-driver/mysql

用法示例

示例表结构为:

| demo  | CREATE TABLE `demo` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `add_time` timestamp NOT NULL DEFAULT current_timestamp(),
  `edit_time` timestamp NOT NULL DEFAULT current_timestamp(),
  `name` varchar(20) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
  `status` tinyint(4) unsigned NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `status` (`status`),
  KEY `add_time` (`add_time`),
  KEY `edit_time` (`edit_time`)
) ENGINE=InnoDB AUTO_INCREMENT=478 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
package main

import (
    "github.com/goinbox/mysql"

    "database/sql"
    "strconv"
    "fmt"
)

type tableDemoRowItem struct {
    Id       int64
    AddTime  string
    EditTime string
    Name     string
    Status   int
}

var client *mysql.Client

func main() {
    config := mysql.NewConfig("root", "123", "127.0.0.1", "3306", "gobox-demo")
    client, _ = mysql.NewClient(config, nil)

    client.Exec("DELETE FROM demo")

    fmt.Println("testClientExec:")
    testClientExec()
    fmt.Println("")

    fmt.Println("testClientQuery:")
    testClientQuery()
    fmt.Println("")

    fmt.Println("testClientQueryRow:")
    testClientQueryRow()
    fmt.Println("")

    fmt.Println("testClientTrans:")
    testClientTrans()
    fmt.Println("")
}

func testClientExec() {
    result, err := client.Exec("INSERT INTO demo (name) VALUES (?),(?)", "a", "b")
    if err != nil {
        fmt.Println("exec error: " + err.Error())
    } else {
        li, err := result.LastInsertId()
        if err != nil {
            fmt.Println("lastInsertId error: " + err.Error())
        } else {
            fmt.Println("lastInsertId: " + strconv.FormatInt(li, 10))
        }

        rf, err := result.RowsAffected()
        if err != nil {
            fmt.Println("rowsAffected error: " + err.Error())
        } else {
            fmt.Println("rowsAffected: " + strconv.FormatInt(rf, 10))
        }
    }
}

func testClientQuery() {
    rows, err := client.Query("SELECT * FROM demo WHERE name IN (?,?)", "a", "b")
    if err != nil {
        fmt.Println("query error: " + err.Error())
    } else {
        for rows.Next() {
            item := new(tableDemoRowItem)
            err = rows.Scan(&item.Id, &item.AddTime, &item.EditTime, &item.Name, &item.Status)
            if err != nil {
                fmt.Println("rows scan error: " + err.Error())
            } else {
                fmt.Println(item)
            }
        }
    }
}

func testClientQueryRow() {
    row := client.QueryRow("SELECT * FROM demo WHERE name = ?", "a")
    item := new(tableDemoRowItem)
    err := row.Scan(&item.Id, &item.AddTime, &item.EditTime, &item.Name, &item.Status)
    if err != nil {
        if err == sql.ErrNoRows {
            fmt.Println("no rows: " + err.Error())
        } else {
            fmt.Println("row scan error: " + err.Error())
        }
    } else {
        fmt.Println(item)
    }
}

func testClientTrans() {
    client.Begin()

    row := client.QueryRow("SELECT * FROM demo WHERE name = ?", "a")
    item := new(tableDemoRowItem)
    err := row.Scan(&item.Id, &item.AddTime, &item.EditTime, &item.Name, &item.Status)
    if err != nil {
        fmt.Println("row scan error: " + err.Error())
    } else {
        fmt.Println(item)
    }

    client.Commit()

    err = client.Rollback()
    fmt.Println(err)
}

程序输出:

testClientExec:
lastInsertId: 474
rowsAffected: 2

testClientQuery:
&{474 2018-07-21 09:53:43 2018-07-21 09:53:43 a 0}
&{475 2018-07-21 09:53:43 2018-07-21 09:53:43 b 0}

testClientQueryRow:
&{474 2018-07-21 09:53:43 2018-07-21 09:53:43 a 0}

testClientTrans:
&{474 2018-07-21 09:53:43 2018-07-21 09:53:43 a 0}
Not in trans

ligang@vm-xubuntu ~/tmp/go $ go run main.go 
testClientExec:
lastInsertId: 476
rowsAffected: 2

testClientQuery:
&{476 2018-07-21 09:53:52 2018-07-21 09:53:52 a 0}
&{477 2018-07-21 09:53:52 2018-07-21 09:53:52 b 0}

testClientQueryRow:
&{476 2018-07-21 09:53:52 2018-07-21 09:53:52 a 0}

testClientTrans:
&{476 2018-07-21 09:53:52 2018-07-21 09:53:52 a 0}
Not in trans

欢迎大家使用,使用中有遇到问题随时反馈,我们会尽快响应,谢谢!

相关文章

  • gobox中mysql操作

    今天来说下使用gobox中mysql操作相关 说明 本包的driver部分使用了go-sql-driver:htt...

  • gobox中redis操作

    今天来说下使用gobox中redis操作相关 说明 本包的driver部分使用了redigo:https://gi...

  • gobox中的分页操作

    今天来说下使用gobox中的分页操作 说明 分页也是我们开发时的一个常见需求,gobox中提供了page包做这个事...

  • gobox中的log操作

    今天来说下使用gobox中的log操作 log级别定义 重要的interface IWriter 定义消息写入到哪...

  • gobox中的连接池pool

    今天来说下gobox中的连接池底层实现pool 为什么需要连接池 我们的系统在访问外部资源(redis、mysql...

  • gobox中的simplecache和levelcache

    今天来说下gobox中的simplecache和levelcache simplecache simplecach...

  • gobox中的shardmap

    今天来说下gobox中的shardmap。 golang中的map使用简单,但并发写入时,如果不加锁,会导致pan...

  • gobox中的httpclient

    今天来说下使用gobox中httpclient,这个包就相当于命令行的curl工具,用于发起http请求。 重要的...

  • MySQL 基础操作

    · MySQL中不分大小写· MySQL中分为DML(数据操作语言) 和 DDL(数据定义语音) DML(数据操作...

  • 8.mysql之异步操作

    mysql之异步操作 普通的mysql操作是同步操作,插入数据的速度(即I/O读写)远远低于spider中解析数据...

网友评论

    本文标题:gobox中mysql操作

    本文链接:https://www.haomeiwen.com/subject/mazcmftx.html