golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动。这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/MySQL这个驱动,更新维护都比较好。下面演示下具体的使用,完整代码示例可以参考最后。

下载驱动

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

如果提示这样的失败信息:cannot download, $GOPATH not set. For more details see: go help gopath,可以使用如下命令解决

sudo env GOPATH=/Users/chenjiebin/golang go get github.com/go-sql-driver/mysql

GOPATH的值根据自行环境进行替换。

创建测试表

在mysql test库中创建测试表

CREATE TABLE IF NOT EXISTS `test`.`user` (`user_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户编号',`user_name` VARCHAR(45) NOT NULL COMMENT '用户名称',`user_age` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户年龄',`user_sex` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户性别',PRIMARY KEY (`user_id`))ENGINE = InnoDBAUTO_INCREMENT = 1DEFAULT CHARACTER SET = utf8COLLATE = utf8_general_ciCOMMENT = '用户表'

数据库连接

数据库连接使用datebase/sql Open函数进行连接

1
db, err := sql.Open("mysql""user:password@tcp(localhost:5555)/dbname?charset=utf8")

其中连接参数可以有如下几种形式:

user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:5555)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname

通常我们都用第二种。

插入操作

1
2
3
4
5
6
7
stmt, err := db.Prepare(`INSERT user (user_name,user_age,user_sex) values (?,?,?)`)
checkErr(err)
res, err := stmt.Exec("tony"201)
checkErr(err)
id, err := res.LastInsertId()
checkErr(err)
fmt.Println(id)

这里使用结构化操作,不推荐使用直接拼接sql语句的方法。

查询操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rows, err := db.Query("SELECT * FROM user")
checkErr(err)
for rows.Next() {
    var userId int
    var userName string
    var userAge int
    var userSex int
    rows.Columns()
    err = rows.Scan(&userId, &userName, &userAge, &userSex)
    checkErr(err)
    fmt.Println(userId)
    fmt.Println(userName)
    fmt.Println(userAge)
    fmt.Println(userSex)
}

这里查询的方式使用声明4个独立变量userId、userName、userAge、userSex来保存查询出来的每一行的值。在实际开发中通常会封装数据库的操作,对这样的查询通常会考虑返回字典类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//构造scanArgs、values两个数组,scanArgs的每个值指向values相应值的地址
columns, _ := rows.Columns()
scanArgs := make([]interface{}, len(columns))
values := make([]interface{}, len(columns))
for i := range values {
    scanArgs[i] = &values[i]
}
for rows.Next() {
    //将行数据保存到record字典
    err = rows.Scan(scanArgs...)
    record := make(map[string]string)
    for i, col := range values {
        if col != nil {
            record[columns[i]] = string(col.([]byte))
        }
    }
    fmt.Println(record)
}

修改操作

1
2
3
4
5
6
7
stmt, err := db.Prepare(`UPDATE user SET user_age=?,user_sex=? WHERE user_id=?`)
checkErr(err)
res, err := stmt.Exec(2121)
checkErr(err)
num, err := res.RowsAffected()
checkErr(err)
fmt.Println(num)

删除操作

1
2
3
4
5
6
7
stmt, err := db.Prepare(`DELETE FROM user WHERE user_id=?`)
checkErr(err)
res, err := stmt.Exec(1)
checkErr(err)
num, err := res.RowsAffected()
checkErr(err)
fmt.Println(num)

修改和删除操作都比较简单,同插入数据类似,只是使用RowsAffected来获取影响的数据行数。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package main
import (
    "database/sql"
    "fmt"
    "github.com/go-sql-driver/mysql"
)
func main() {
    insert()
}
//插入demo
func insert() {
    db, err := sql.Open("mysql""root:@/test?charset=utf8")
    checkErr(err)
    stmt, err := db.Prepare(`INSERT user (user_name,user_age,user_sex) values (?,?,?)`)
    checkErr(err)
    res, err := stmt.Exec("tony"201)
    checkErr(err)
    id, err := res.LastInsertId()
    checkErr(err)
    fmt.Println(id)
}
//查询demo
func query() {
    db, err := sql.Open("mysql""root:@/test?charset=utf8")
    checkErr(err)
    rows, err := db.Query("SELECT * FROM user")
    checkErr(err)
    //普通demo
    //for rows.Next() {
    //    var userId int
    //    var userName string
    //    var userAge int
    //    var userSex int
    //    rows.Columns()
    //    err = rows.Scan(&userId, &userName, &userAge, &userSex)
    //    checkErr(err)
    //    fmt.Println(userId)
    //    fmt.Println(userName)
    //    fmt.Println(userAge)
    //    fmt.Println(userSex)
    //}
    //字典类型
    //构造scanArgs、values两个数组,scanArgs的每个值指向values相应值的地址
    columns, _ := rows.Columns()
    scanArgs := make([]interface{}, len(columns))
    values := make([]interface{}, len(columns))
    for i := range values {
        scanArgs[i] = &values[i]
    }
    for rows.Next() {
        //将行数据保存到record字典
        err = rows.Scan(scanArgs...)
        record := make(map[string]string)
        for i, col := range values {
            if col != nil {
                record[columns[i]] = string(col.([]byte))
            }
        }
        fmt.Println(record)
    }
}
//更新数据
func update() {
    db, err := sql.Open("mysql""root:@/test?charset=utf8")
    checkErr(err)
    stmt, err := db.Prepare(`UPDATE user SET user_age=?,user_sex=? WHERE user_id=?`)
    checkErr(err)
    res, err := stmt.Exec(2121)
    checkErr(err)
    num, err := res.RowsAffected()
    checkErr(err)
    fmt.Println(num)
}
//删除数据
func remove() {
    db, err := sql.Open("mysql""root:@/test?charset=utf8")
    checkErr(err)
    stmt, err := db.Prepare(`DELETE FROM user WHERE user_id=?`)
    checkErr(err)
    res, err := stmt.Exec(1)
    checkErr(err)
    num, err := res.RowsAffected()
    checkErr(err)
    fmt.Println(num)
}
func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

小结

整体上来说都比较简单,就是查询那边使用字典来存储返回数据比较复杂一些。既然说到数据库连接,通常应用中都会使用连接池来减少连接开销,关于连接池下次整理一下再放上来。

来源:http://www.01happy.com/golang-mysql-demo/

golang连接mysql操作示例增删改查(已经测试)相关推荐

  1. golang连接mysql操作示例增删改查

    golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动.这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/ ...

  2. go语言代码连接mysql_【mysql】golang连接mysql操作示例增删改查

    golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动.这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/ ...

  3. golag mysql_golang连接mysql操作示例增删改查

    golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动.这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/ ...

  4. adodb mysql.inc.php,php adodb操作mysql数据库示例(增删改查)

    php adodb操作mysql数据库示例(增删改查) 发布于 2014-10-05 08:16:18 | 113 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: H ...

  5. C#语言连接Mysql数据库实现增删改查

    C#语言连接Mysql数据库实现增删改查 实现效果如图 在此之前先下载一个mysql.dll 库 如下 链接:https://pan.baidu.com/s/17Nv_1W3KbXfWgdOvWf_S ...

  6. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

  7. c 连接mysql怎么增删改_C++ API方式连接mysql数据库实现增删改查

    这里复制的 http://www.bitscn.com/pdb/mysql/201407/226252.html 一.环境配置 1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了, ...

  8. DAO模式设计-JDBC连接Mysql数据库实现增删改查及JunitTest单元测试

     概念介绍 JDBC JDBC(Java数据库连接,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC ...

  9. Node 连接Mysql并进行增删改查

    NPM: NPM的全称是Node Package Manager,类似于ruby的gem,Python的PyPL.setuptools,PHP的pear,是Nodejs中的包管理器.Nodejs自身提 ...

最新文章

  1. Hibernate主键生成方式
  2. 简单说说你对Java内存模型的原子性的了解吧?
  3. The working copy is locked due to a previous error.
  4. spring定时任务详解(@Scheduled注解)多线程讲解
  5. how is metadata got - DB table iwfndi_med_srh and IWFNDCL_MGW_REQUEST_MANAG
  6. PHP从零开始--循环数组
  7. 如何基于OSS和MTS,快速搭建音视频文件上传服务?
  8. 转换构造函数与类型构造函数与运算符重载函数
  9. css3禅密花园叫什么名字_CSS秘密花园:灵活的椭圆形
  10. Mysql 日志管理详解
  11. Noip2013花匠
  12. 图像条纹检测 python_光源在外观缺陷检测中的应用
  13. 程序员面试必备的网络编程知识
  14. eclipse中文版自动补全设置
  15. 如何清除百度云管家计算机图标,怎么样删除我的电脑里的百度云管家图标
  16. ISIS协议与Quagga ISIS配置
  17. SpringBoot的报错找不到Mapper(解决:required a bean of type com.xxx.mapper.UserMapper that could not be found)
  18. android粘性广播何时结束,Android之粘性广播理解
  19. SQL Server排序规则
  20. EDM数据之大数据是什么

热门文章

  1. vue 获取当前发布的版本_Vue 3.0重磅发布!
  2. linux redis -p,linux 安装redis
  3. 「Python」Command “python setup.py egg_info“ failed with error code 1 in /tmp/pip-build-Yt_rRN/grpcio
  4. 14_clickhouse,kafka引擎,kafka消息到ClickHouse的MergeTree引擎
  5. 怎样在Ubuntu 14.04中搭建gitolite git服务器
  6. java 时间戳和PHP时间戳 的转换 php time()
  7. RASA NLU Chi安装
  8. 2021年计算机网络期末考试题,2021年计算机网络期末考试试题及答案-20210515145802.doc-原创力文档...
  9. mysql如何drop数据库_mysql drop database删除数据库命令实例讲解
  10. arch Linux 添加引导,ArchLinux 添加开机启动脚本, 亲测