为了账号安全,请及时绑定邮箱和手机立即绑定

Go实现对MySQL的增删改查

标签:
MySQL

依赖

先下载go-sql-driver/mysql

go get -u github.com/go-sql-driver/mysql

数据库

建表:

CREATE TABLE `data` (
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`key` varchar(1024) COLLATE utf8mb4_bin DEFAULT NULL,
`value` varchar(1024) COLLATE utf8mb4_bin DEFAULT NULL,
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

实现代码:

实体对象

func (data Data) String() string {    return fmt.Sprintf("id:%d key:%s value:%s\n[createTime:%d updateTime:%d]\n",
        data.Id, data.Key, data.Value, data.CreateTime.Unix(), data.UpdateTime.Unix())
}

type Data struct {
    Id         int64
    Key        string
    Value      string
    CreateTime time.Time //[]uint8
    UpdateTime time.Time //[]uint8}

获得连接

db, err := sql.Open("mysql", "dubby:123456@tcp(127.0.0.1:3306)/go_test?parseTime=true")if err != nil {
    panic(err.Error())
}

删除

func Delete(id int64, db *sql.DB) error {
    stmtOut, err := db.Prepare("DELETE FROM `data` WHERE id = ?")    if err != nil {
        panic(err.Error())
    }
    defer stmtOut.Close()

    result, err := stmtOut.Exec(id)    if err != nil {
        panic(err.Error())
    }    if rowNum, err := result.RowsAffected(); err != nil || rowNum != int64(1) {
        panic("delete error")
    }    return nil}

新增

func Insert(key string, value string, db *sql.DB) *Data {
    stmtOut, err := db.Prepare("INSERT INTO `data` (`key`, `value`) values (?, ?)")    if err != nil {
        panic(err.Error())
    }
    defer stmtOut.Close()

    result, err := stmtOut.Exec(key, value)    if err != nil {
        panic(err.Error())
    }    id, err := result.LastInsertId()    if err != nil {
        panic(err.Error())
    }    return QueryById(id, db)
}

更新

func UpdateById(id int64, key string, value string, db *sql.DB) *Data {
    stmtOut, err := db.Prepare("UPDATE `data` SET `key`=?, `value`=? WHERE `id`=?")    if err != nil {
        panic(err.Error())
    }
    defer stmtOut.Close()

    _, err = stmtOut.Exec(key, value, id)    if err != nil {
        panic(err.Error())
    }    return QueryById(id, db)
}

根据ID查询

func QueryById(idRequest int64, db *sql.DB) *Data {
    stmtOut, err := db.Prepare("SELECT * FROM `data` WHERE id = ?")    if err != nil {
        panic(err.Error())
    }
    defer stmtOut.Close()

    rows := stmtOut.QueryRow(idRequest)

    data := new(Data)
    err = rows.Scan(&data.Id, &data.Key, &data.Value, &data.CreateTime, &data.UpdateTime)    if err != nil {
        panic(err.Error())
    }    return data
}

根据ID范围查询

func QueryByIdRange(minId int64, maxId int64, db *sql.DB) []*Data {
    stmtOut, err := db.Prepare("SELECT * FROM `data` WHERE id >= ? AND id <= ?")    if err != nil {
        panic(err.Error())
    }
    defer stmtOut.Close()

    rows, err := stmtOut.Query(minId, maxId)    if err != nil {
        panic(err.Error())
    }

    var result []*Data    for rows.Next() {
        data := new(Data)
        err = rows.Scan(&data.Id, &data.Key, &data.Value, &data.CreateTime, &data.UpdateTime)        if err != nil {
            panic(err.Error())
        }
        result = append(result, data)
    }    return result
}

测试

fmt.Println("========QueryById========")
data := QueryById(2, db)
fmt.Println(*data)

fmt.Println("========QueryByIdRange========")
resultList := QueryByIdRange(1, 10, db)for i := 0; i < len(resultList); i++ {
    fmt.Println(*resultList[i])
}

fmt.Println("========Insert========")
data = Insert("go_key", "go_value", db)
fmt.Println(*data)

fmt.Println("========Delete========")
err = Delete(data.Id, db)
fmt.Println(err)

fmt.Println("========UpdateById========")
data = QueryById(2, db)
prefix := fmt.Sprintf("update-%d-", time.Now().UnixNano()/1000%10000)
data = UpdateById(data.Id, prefix+"dubby", prefix+"www.dubby.cn", db)
fmt.Println(*data)

测试结果

========QueryById========id:2 key:update-5469-dubby value:update-5469-www.dubby.cn
[createTime:1539340810 updateTime:1539345474]

========QueryByIdRange========id:2 key:update-5469-dubby value:update-5469-www.dubby.cn
[createTime:1539340810 updateTime:1539345474]id:3 key:dubby value:dubby.cn
[createTime:1539340810 updateTime:1539340810]id:4 key:test value:test
[createTime:1539343652 updateTime:1539343652]id:5 key:test value:test
[createTime:1539343760 updateTime:1539343760]id:6 key:go_key value:go_value
[createTime:1539343942 updateTime:1539343942]id:7 key:go_key value:go_value
[createTime:1539343956 updateTime:1539343956]id:8 key:go_key value:go_value
[createTime:1539343977 updateTime:1539343977]id:9 key:go_key value:go_value
[createTime:1539343981 updateTime:1539343981]id:10 key:go_key value:go_value
[createTime:1539343982 updateTime:1539343982]

========Insert========id:35 key:go_key value:go_value
[createTime:1539355099 updateTime:1539355099]

========Delete========
<nil>
========UpdateById========id:2 key:update-8738-dubby value:update-8738-www.dubby.cn
[createTime:1539340810 updateTime:1539355099]



作者:我是杨正
链接:https://www.jianshu.com/p/24d35ea869d6


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消