Go实现对MySQL的增删改查

原文链接:https://www.dubby.cn/detail.html?id=9113

依赖

先下载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]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 军营时光,最让我体现价值和感到荣耀的是2009年。那一年,激情燃烧,灿烂绽放,是人生中一道美丽的风景线。 那一年,...
    才秀荣张阅读 911评论 29 19
  • 01 阿宝为了能学到气功,拯救世界,跟着爸爸长途跋涉来到熊猫村。看到的都是和他长得一样的熊猫,只是有的比他胖,有的...
    云淡风轻扬阅读 479评论 0 0
  • 整理笔记的时候看到一篇“嫁给谁都后悔”,鬼使神差,懒神附体的我竟有了想要动笔写一写的冲动…… 我们不过是这浩瀚宇宙...
    四灵阅读 401评论 1 1