http://blog.csdn.net/jesseyoung/article/details/40398321

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连接其他主流数据库的驱动介绍可参考:

https://code.google.com/p/go-wiki/wiki/SQLDrivers

2 测试环境准备
    操作系统:Red Hat Enterprise Linux Server release 6.4 
    mysql版本:mysql-5.5.28
    安装git客户端(方便从github上获取mysql驱动)

  1. [root@localhost /]# yum install git

获取mysql驱动

  1. [root@localhost /]# go get github.com/go-sql-driver/mysql
  2. [root@localhost /]# ls
  3. pkg  src

在当前目录下可以看到多出两个文件夹pkg和src,将src文件夹拷贝到go程序安装目录下或go工作环境下即可

  1. [root@localhost /]# cp -r src /usr/local/go/

3 编程实例

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/go-sql-driver/mysql"
  6. "reflect"
  7. )
  8. func main() {
  9. /*DSN数据源名称
  10. [username[:password]@][protocol[(address)]]/dbname[?param1=value1¶mN=valueN]
  11. user@unix(/path/to/socket)/dbname
  12. user:password@tcp(localhost:5555)/dbname?charset=utf8&autocommit=true
  13. user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?charset=utf8mb4,utf8
  14. user:password@/dbname
  15. 无数据库: user:password@/
  16. */
  17. db, err := sql.Open("mysql", "jesse:jesse@tcp(127.0.0.1:3306)/?charset=utf8") //第一个参数为驱动名
  18. checkErr(err)
  19. db.Query("drop database if exists tmpdb")
  20. db.Query("create database tmpdb")
  21. //db.Query("use tmpdb")
  22. db.Query("create table tmpdb.tmptab(c1 int, c2 varchar(20), c3 varchar(20))")
  23. db.Query("insert into tmpdb.tmptab values(101, '姓名1', 'address1'), (102, '姓名2', 'address2'), (103, '姓名3', 'address3'), (104, '姓名4', 'address4')")
  24. //checkErr(err)
  25. query, err := db.Query("select * from tmpdb.tmptab")
  26. checkErr(err)
  27. v := reflect.ValueOf(query)
  28. fmt.Println(v)
  29. fmt.Println("--增加数据测试--")
  30. printResult(query)
  31. db.Query("delete from tmpdb.tmptab where c1 = 101")
  32. //checkErr(err)
  33. query2, _ := db.Query("select * from tmpdb.tmptab")
  34. fmt.Println("--删除数据测试--")
  35. printResult(query2)
  36. db.Query("update tmpdb.tmptab set c3 = 'address4' where c1 = 103")
  37. //checkErr(err)
  38. query3, _ := db.Query("select * from tmpdb.tmptab")
  39. fmt.Println("--更新数据测试--")
  40. printResult(query3)
  41. db.Query("delete from tmpdb.tmptab")
  42. //checkErr(err)
  43. query4, _ := db.Query("select * from tmpdb.tmptab")
  44. fmt.Println("--清空数据测试--")
  45. printResult(query4)
  46. db.Query("drop table tmpdb.tmptab")
  47. db.Query("drop database tmpdb")
  48. //stmt, err := db.Prepare("create database tmpdb")
  49. db.Close()
  50. }
  51. func checkErr(errMasg error) {
  52. if errMasg != nil {
  53. panic(errMasg)
  54. }
  55. }
  56. func printResult(query *sql.Rows) {
  57. column, _ := query.Columns()              //读出查询出的列字段名
  58. values := make([][]byte, len(column))     //values是每个列的值,这里获取到byte里
  59. scans := make([]interface{}, len(column)) //因为每次查询出来的列是不定长的,用len(column)定住当次查询的长度
  60. for i := range values {                   //让每一行数据都填充到[][]byte里面
  61. scans[i] = &values[i]
  62. }
  63. results := make(map[int]map[string]string) //最后得到的map
  64. i := 0
  65. for query.Next() { //循环,让游标往下移动
  66. if err := query.Scan(scans...); err != nil { //query.Scan查询出来的不定长值放到scans[i] = &values[i],也就是每行都放在values里
  67. fmt.Println(err)
  68. return
  69. }
  70. row := make(map[string]string) //每行数据
  71. for k, v := range values {     //每行数据是放在values里面,现在把它挪到row里
  72. key := column[k]
  73. row[key] = string(v)
  74. }
  75. results[i] = row //装入结果集中
  76. i++
  77. }
  78. for k, v := range results { //查询出来的数组
  79. fmt.Println(k, v)
  80. }
  81. }

4 运行程序

    4.1 编译运行

  1. [root@localhost /]# go build MysqlGoTest.go
  2. [root@localhost /]# ls
  3. MysqlGoTest.go  MysqlGoTest
  4. [root@localhost /]# ./MysqlGoTest

4.2 直接运行

  1. [root@localhost /]# go run MysqlGoTest.go
  2. <*sql.Rows Value>
  3. --增加数据测试--
  4. 0 map[c1:101 c2:姓名1 c3:address1]
  5. 1 map[c1:102 c2:姓名2 c3:address2]
  6. 2 map[c1:103 c2:姓名3 c3:address3]
  7. 3 map[c1:104 c2:姓名4 c3:address4]
  8. --删除数据测试--
  9. 0 map[c1:102 c2:姓名2 c3:address2]
  10. 1 map[c1:103 c2:姓名3 c3:address3]
  11. 2 map[c1:104 c2:姓名4 c3:address4]
  12. --更新数据测试--
  13. 0 map[c1:102 c2:姓名2 c3:address2]
  14. 1 map[c1:103 c2:姓名3 c3:address4]
  15. 2 map[c1:104 c2:姓名4 c3:address4]
  16. --清空数据测试--

5 补充知识

    5.1 避免中文乱码

为确保程序写入数据库以及从数据库读出时不出现乱码,需要做如下配置:     go客户端程序级别:     go程序文件设置编码 utf8,如

  1. db, err := sql.Open("mysql", "jesse:jesse@tcp(127.0.0.1:3306)/?charset=utf8")

    mysql数据库级别:
    设置MySQL数据库客户端及服务端配置为utf8 
    例如:
    在my.cnf配置文件中配置

  1. [mysql]
  2. default_character_set=utf8
  3. [mysqld]
  4. character-set-server=utf8
  5. collation-server=utf8_bin

    5.2 go语言反射机制

用途:可获取对象数据类型

很多语言都有反射机制。通过反射,我们可以知道一个未知对像的属性,方法。

在写一个函数的时候,有时你需要另外一个对象或者类的某些属性,方法,但这个程序不能认识所需要的对象或者类,这时便需要通过反射来操作了。通过反射,你变很方便的加载、探知、使用编译期间完全未知的对象或者类了。

所谓反射,也就是相当于物理的反射,你通过镜子,可以看到自己的摸样,函数通过反射,可以获得想要的信息。在golang的反射包reflect中,反射类型Type()和Value(),可以改变反射回来变量的值。例如获取变量value的类型,可通过函数reflect.ValueOf()进行操作。

  1. var value interface {} = &User{1,"Tom",12,"nan"}
  2. v := reflect.ValueOf(value)
  3. fmt.Println(v)

****************************************************************************************
    原文地址:http://blog.csdn.net/jesseyoung/article/details/40398321
    博客主页:http://blog.csdn.net/jesseyoung
****************************************************************************************

go语言操作mysql范例(增删查改)的更多相关文章

  1. Python对MySQL进行增删查改

    python连接MySQL数据库:pymysql # 测试操作 import pymysql # 打开数据库 db = pymysql.connect("localhost", & ...

  2. Mysql常用增删查改及入门(二)

    常用:数据库常用就是DML:增删查改 1.增加数据: insert into 表名 values (值1,值2...); insert into 表名 (字段1,字段2) values (值1,值2) ...

  3. VisualStudio 连接 MySql 实现增删查改

    首先创建数据库,建立一个用户登录表 2.visualStudio默认是不支持MySql的,要想通过Ado.Net 操作MySql 需要在管理NeGet包添加对MySql.Data  和 MySql.D ...

  4. Yii2使用数据库操作汇总(增删查改、事务)

    查询 //1.简单查询 $admin=Admin::model()->findAll($condition,$params); $admin=Admin::model()->findAll ...

  5. asp.net操作xml(增删查改)

    asp.net操作xml 1.xml文档Products.xml <?xml version="1.0" encoding="utf-8"?> &l ...

  6. 后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)

    1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...

  7. PHP与MYSQL结合操作——文章发布系统小项目(实现基本增删查改操作)

    php和mysql在一起几十年了,也是一对老夫老妻了,最近正在对他们的爱情故事进行探讨,并做了一个很简单的小东西——文章发布系统,目的是为了实现mysql对文章的基本增删查改操作 前台展示系统有:文章 ...

  8. Java连接MySQL数据库及简单的增删查改操作

    主要摘自 https://www.cnblogs.com/town123/p/8336244.html https://www.runoob.com/java/java-mysql-connect.h ...

  9. nodejs连接mysql并进行简单的增删查改

    最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs ...

随机推荐

  1. 为什么Java方法里面不能再嵌套方法?

    直接原因: 这是Java基本语法定义的,方法中不可以再次声明方法,只能调用其他的方法. 个人理解: 1.方法栈是需要一个载体的,这个载体就是Class,如果一个方法的上一级不是一个类,就说明没有载体. ...

  2. js实现一个可以兼容PC端和移动端的div拖动效果

    前段时间写了一个简单的div拖动效果,不料昨天项目上正好需要一个相差不多的需求,就正好用上了,但是在移动端的时候却碰到了问题,拖动时候用到的三个事件:mousedown.mousemove.mouse ...

  3. 启发式算法(Heuristic Algorithm)

    背景: 李航的<统计学习方法>一书中提到:决策树算法通常采用启发式算法,故了解之 问题解答: 时间有限,这里也只是将算法和启发式算法的区别和简单发展摘录如下: 一.算法和启发式方法之间的差 ...

  4. 搭建hexo博客

    hexo 是一款快速.简单.并且强大的博客博客模板框架 - 基于nodejs . 特点 基于nodejs 使用Markdown书写文章 无需数据库 可以使用GitHub Pages发布 要用到的模块 ...

  5. FIR.im Weekly - 这是多产的一周

    前方干货颇多,请备好小板凳,泡好茶,慢慢看. 上周四到周六(23号-25号),由 infoQ 主办的 QCon 在北京召开,各技术大牛围绕敏捷开发.技术架构.开发实践等话题进行了技术分享与探讨. QC ...

  6. 快速入门系列--CLR--02多线程

    最近,由于基础框架的整体升级,因此需要更新所有相关项目的DLL文件.这个过程存在不小的风险,因此也对发布后的生产服务器进行了密切的监控,结果还是出现了个别应用出现异常的情况,很快的占用了大量的服务器内 ...

  7. CSS3伸缩布局Flex学习笔记

    如果需要使用伸缩布局首先得把display:flex;对于兼容还得加前缀display:-webkit-display:flex;等其他浏览器前缀,但我本机Chrome测试已经不需要加前缀了,其实这些 ...

  8. Unity 产生各不相同的随机数

    1. 网上很多方法都说用时间种子来解决,但是在极短的时间内,这种方法没效 Random r = new Random(DateTime.Now.Millisecond); Random Counter ...

  9. 深入理解PHP内核(五)函数的内部结构

    php的函数包括用户定义的函数.内部函数(print_r count...).匿名函数.变量函数($func = 'print_r'; $func(array('a','b'));) PHP内核源码中 ...

  10. 深入理解CSS变形transform(3d)

    × 目录 [1]坐标轴 [2]透视 [3]变形函数 [4]透视函数 [5]变形原点 [6]背景可见 [7]变形风格 前面的话 本文将详细介绍关于transform变形3D的内容,但需以了解transf ...