go语言操作mysql范例(增删查改)
来源:互联网 发布:脱发不光头知乎 编辑:程序博客网 时间:2024/05/15 12:10
1 go语言连接mysql简介
go官方仅提供了database package,database package下有两个包sql,sql/driver。这两个包用来定义操作数据库的接口,这就保证了无论使用哪种数据库,他们的操作方式都是相同的。
但go官方并没有提供连接数据库的driver,如果要操作数据库,还需要第三方的driver 包,最常用的有:
https://github.com/Go-SQL-Driver/MySQL支持database/sql,全部采用go写。
https://github.com/ziutek/mymysql 支持database/sql,也支持自定义的接口,全部采用go写。
推荐使用前者,因为前者的效率更高一点,二者效率的对比可参考benchmark测试结果:https://github.com/go-sql-driver/sql-benchmark
go连接其他主流数据库的驱动介绍可参考:
操作系统:Red Hat Enterprise Linux Server release 6.4
mysql版本:mysql-5.5.28
安装git客户端(方便从github上获取mysql驱动)
设置MySQL数据库客户端及服务端配置为utf8
例如:
在my.cnf配置文件中配置
****************************************************************************************
原文地址:http://blog.csdn.net/jesseyoung/article/details/40398321
博客主页:http://blog.csdn.net/jesseyoung
****************************************************************************************
go官方仅提供了database package,database package下有两个包sql,sql/driver。这两个包用来定义操作数据库的接口,这就保证了无论使用哪种数据库,他们的操作方式都是相同的。
但go官方并没有提供连接数据库的driver,如果要操作数据库,还需要第三方的driver 包,最常用的有:
https://github.com/Go-SQL-Driver/MySQL支持database/sql,全部采用go写。
https://github.com/ziutek/mymysql 支持database/sql,也支持自定义的接口,全部采用go写。
推荐使用前者,因为前者的效率更高一点,二者效率的对比可参考benchmark测试结果:https://github.com/go-sql-driver/sql-benchmark
go连接其他主流数据库的驱动介绍可参考:
https://code.google.com/p/go-wiki/wiki/SQLDrivers
操作系统:Red Hat Enterprise Linux Server release 6.4
mysql版本:mysql-5.5.28
安装git客户端(方便从github上获取mysql驱动)
[root@localhost /]# yum install git获取mysql驱动
[root@localhost /]# go get github.com/go-sql-driver/mysql[root@localhost /]# lspkg src在当前目录下可以看到多出两个文件夹pkg和src,将src文件夹拷贝到go程序安装目录下或go工作环境下即可
[root@localhost /]# cp -r src /usr/local/go/3 编程实例
package mainimport ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "reflect")func main() { /*DSN数据源名称 [username[:password]@][protocol[(address)]]/dbname[?param1=value1¶mN=valueN] user@unix(/path/to/socket)/dbname user:password@tcp(localhost:5555)/dbname?charset=utf8&autocommit=true user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?charset=utf8mb4,utf8 user:password@/dbname 无数据库: user:password@/ */ db, err := sql.Open("mysql", "jesse:jesse@tcp(127.0.0.1:3306)/?charset=utf8") //第一个参数为驱动名 checkErr(err) db.Query("drop database if exists tmpdb") db.Query("create database tmpdb") //db.Query("use tmpdb") db.Query("create table tmpdb.tmptab(c1 int, c2 varchar(20), c3 varchar(20))") db.Query("insert into tmpdb.tmptab values(101, '姓名1', 'address1'), (102, '姓名2', 'address2'), (103, '姓名3', 'address3'), (104, '姓名4', 'address4')") //checkErr(err) query, err := db.Query("select * from tmpdb.tmptab") checkErr(err) v := reflect.ValueOf(query) fmt.Println(v) fmt.Println("--增加数据测试--") printResult(query) db.Query("delete from tmpdb.tmptab where c1 = 101") //checkErr(err) query2, _ := db.Query("select * from tmpdb.tmptab") fmt.Println("--删除数据测试--") printResult(query2) db.Query("update tmpdb.tmptab set c3 = 'address4' where c1 = 103") //checkErr(err) query3, _ := db.Query("select * from tmpdb.tmptab") fmt.Println("--更新数据测试--") printResult(query3) db.Query("delete from tmpdb.tmptab") //checkErr(err) query4, _ := db.Query("select * from tmpdb.tmptab") fmt.Println("--清空数据测试--") printResult(query4) db.Query("drop table tmpdb.tmptab") db.Query("drop database tmpdb") //stmt, err := db.Prepare("create database tmpdb") db.Close()}func checkErr(errMasg error) { if errMasg != nil { panic(errMasg) }}func printResult(query *sql.Rows) { column, _ := query.Columns() //读出查询出的列字段名 values := make([][]byte, len(column)) //values是每个列的值,这里获取到byte里 scans := make([]interface{}, len(column)) //因为每次查询出来的列是不定长的,用len(column)定住当次查询的长度 for i := range values { //让每一行数据都填充到[][]byte里面 scans[i] = &values[i] } results := make(map[int]map[string]string) //最后得到的map i := 0 for query.Next() { //循环,让游标往下移动 if err := query.Scan(scans...); err != nil { //query.Scan查询出来的不定长值放到scans[i] = &values[i],也就是每行都放在values里 fmt.Println(err) return } row := make(map[string]string) //每行数据 for k, v := range values { //每行数据是放在values里面,现在把它挪到row里 key := column[k] row[key] = string(v) } results[i] = row //装入结果集中 i++ } for k, v := range results { //查询出来的数组 fmt.Println(k, v) }}4 运行程序
4.1 编译运行
[root@localhost /]# go build MysqlGoTest.go[root@localhost /]# lsMysqlGoTest.go MysqlGoTest[root@localhost /]# ./MysqlGoTest
4.2 直接运行
[root@localhost /]# go run MysqlGoTest.go<*sql.Rows Value>--增加数据测试--0 map[c1:101 c2:姓名1 c3:address1]1 map[c1:102 c2:姓名2 c3:address2]2 map[c1:103 c2:姓名3 c3:address3]3 map[c1:104 c2:姓名4 c3:address4]--删除数据测试--0 map[c1:102 c2:姓名2 c3:address2]1 map[c1:103 c2:姓名3 c3:address3]2 map[c1:104 c2:姓名4 c3:address4]--更新数据测试--0 map[c1:102 c2:姓名2 c3:address2]1 map[c1:103 c2:姓名3 c3:address4]2 map[c1:104 c2:姓名4 c3:address4]--清空数据测试--
5 补充知识
5.1 避免中文乱码
为确保程序写入数据库以及从数据库读出时不出现乱码,需要做如下配置:
go客户端程序级别:
go程序文件设置编码 utf8,如
db, err := sql.Open("mysql", "jesse:jesse@tcp(127.0.0.1:3306)/?charset=utf8")mysql数据库级别:
设置MySQL数据库客户端及服务端配置为utf8
例如:
在my.cnf配置文件中配置
[mysql] default_character_set=utf8 [mysqld] character-set-server=utf8 collation-server=utf8_bin
5.2 go语言反射机制
用途:可获取对象数据类型很多语言都有反射机制。通过反射,我们可以知道一个未知对像的属性,方法。
在写一个函数的时候,有时你需要另外一个对象或者类的某些属性,方法,但这个程序不能认识所需要的对象或者类,这时便需要通过反射来操作了。通过反射,你变很方便的加载、探知、使用编译期间完全未知的对象或者类了。
所谓反射,也就是相当于物理的反射,你通过镜子,可以看到自己的摸样,函数通过反射,可以获得想要的信息。在golang的反射包reflect中,反射类型Type()和Value(),可以改变反射回来变量的值。例如获取变量value的类型,可通过函数reflect.ValueOf()进行操作。
var value interface {} = &User{1,"Tom",12,"nan"}v := reflect.ValueOf(value)fmt.Println(v)
****************************************************************************************
原文地址:http://blog.csdn.net/jesseyoung/article/details/40398321
博客主页:http://blog.csdn.net/jesseyoung
****************************************************************************************
0 0
- go语言操作mysql范例(增删查改)
- C语言操作mysql范例(增删查改)
- Go语言操作mysql实现增删改查
- python操作mysql范例(增删查改)
- go操作操作mysql(增删改查)
- Go语言之MySQL增删改查
- go 操作mysql、增删改查
- Go操作mysql实现增删改查及连接池
- py mysql 操作(增删改查)
- Linux C语言连接MySQL 增删改查操作
- Linux C语言连接MySQL 增删改查操作
- Linux C语言连接MySQL 增删改查操作
- Linux C语言连接MySQL 增删改查操作
- Linux C语言连接MySQL 增删改查操作
- C语言操作MySQL数据库的增删改查
- Linux C语言连接MySQL 增删改查操作
- thinkphp增删改查范例
- MySQL---操作数据表基本操作(增删改查)
- C#实验9一二合集
- JAVA htmlParser解析
- Tomat集群 + Tomcat集群session共享 + Nginx负载 + Nginx静态资源代理
- HTML4 和 HTML5 的10个关键区别
- 星号图
- go语言操作mysql范例(增删查改)
- 第九周项目二 分数的累加
- OpenGL中glFrustum()和gluPerspective()的相互转换
- SecureCRT缓存大小设置,linux终端缓存大小解决方案
- 第九周项目3--输出星号图
- 黑马程序员—java基础学习--多线程
- UE4在VS2013中各个编译配置代表意义
- Win7 默认80端口被占用
- Linux内核时间管理和定时器