golang连接mysql操作示例增删改查(已经测试)
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" , 20 , 1 )
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( 21 , 2 , 1 )
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" , 20 , 1 )
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( 21 , 2 , 1 )
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操作示例增删改查(已经测试)相关推荐
- golang连接mysql操作示例增删改查
golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动.这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/ ...
- go语言代码连接mysql_【mysql】golang连接mysql操作示例增删改查
golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动.这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/ ...
- golag mysql_golang连接mysql操作示例增删改查
golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动.这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/ ...
- adodb mysql.inc.php,php adodb操作mysql数据库示例(增删改查)
php adodb操作mysql数据库示例(增删改查) 发布于 2014-10-05 08:16:18 | 113 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: H ...
- C#语言连接Mysql数据库实现增删改查
C#语言连接Mysql数据库实现增删改查 实现效果如图 在此之前先下载一个mysql.dll 库 如下 链接:https://pan.baidu.com/s/17Nv_1W3KbXfWgdOvWf_S ...
- java jdbc 连接mysql数据库 实现增删改查
好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...
- c 连接mysql怎么增删改_C++ API方式连接mysql数据库实现增删改查
这里复制的 http://www.bitscn.com/pdb/mysql/201407/226252.html 一.环境配置 1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了, ...
- DAO模式设计-JDBC连接Mysql数据库实现增删改查及JunitTest单元测试
概念介绍 JDBC JDBC(Java数据库连接,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC ...
- Node 连接Mysql并进行增删改查
NPM: NPM的全称是Node Package Manager,类似于ruby的gem,Python的PyPL.setuptools,PHP的pear,是Nodejs中的包管理器.Nodejs自身提 ...
最新文章
- Hibernate主键生成方式
- 简单说说你对Java内存模型的原子性的了解吧?
- The working copy is locked due to a previous error.
- spring定时任务详解(@Scheduled注解)多线程讲解
- how is metadata got - DB table iwfndi_med_srh and IWFNDCL_MGW_REQUEST_MANAG
- PHP从零开始--循环数组
- 如何基于OSS和MTS,快速搭建音视频文件上传服务?
- 转换构造函数与类型构造函数与运算符重载函数
- css3禅密花园叫什么名字_CSS秘密花园:灵活的椭圆形
- Mysql 日志管理详解
- Noip2013花匠
- 图像条纹检测 python_光源在外观缺陷检测中的应用
- 程序员面试必备的网络编程知识
- eclipse中文版自动补全设置
- 如何清除百度云管家计算机图标,怎么样删除我的电脑里的百度云管家图标
- ISIS协议与Quagga ISIS配置
- SpringBoot的报错找不到Mapper(解决:required a bean of type com.xxx.mapper.UserMapper that could not be found)
- android粘性广播何时结束,Android之粘性广播理解
- SQL Server排序规则
- EDM数据之大数据是什么
热门文章
- vue 获取当前发布的版本_Vue 3.0重磅发布!
- linux redis -p,linux 安装redis
- 「Python」Command “python setup.py egg_info“ failed with error code 1 in /tmp/pip-build-Yt_rRN/grpcio
- 14_clickhouse,kafka引擎,kafka消息到ClickHouse的MergeTree引擎
- 怎样在Ubuntu 14.04中搭建gitolite git服务器
- java 时间戳和PHP时间戳 的转换 php time()
- RASA NLU Chi安装
- 2021年计算机网络期末考试题,2021年计算机网络期末考试试题及答案-20210515145802.doc-原创力文档...
- mysql如何drop数据库_mysql drop database删除数据库命令实例讲解
- arch Linux 添加引导,ArchLinux 添加开机启动脚本, 亲测