介绍

go-mysql是一个用go写的mysql driver,使用接口类似于go自身的database sql,但是稍微有一点不同,现阶段还不支持集成进go database/sql中,但实现难度并不大,后续可能会接入。

go-mysql最先开始于mixer(一个用go实现的mysql proxy)中,随着mixer的演化,我觉得有必要将其mysql模块独立出来使用。对于mixer,后续我会详细介绍。

为什么要自己实现一套新的接口,而不是go自身的sql接口呢?最主要的原因在于我很不习惯使用Query的查询方式。go自身的query例子:

age := 27
rows, err := db.Query("SELECT name FROM users WHERE age=?", age)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
log.Fatal(err)
}
fmt.Printf("%s is %d\n", name, age)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}

可以看到,使用起来非常的繁琐复杂,如果代码里面select语句很多(恰恰我们代码里面n多select),那么如果每次select都要靠这种方式得到我们需要的结果,那我可能写代码会写崩溃的。所以势必我们需要提供一套封装用来简化select的结果集获取。

Resultset

go-mysql跟go自身的sql接口最大的不一样在于Query的时候直接返回了一个resultset,而这个resultset定义如下:

type Field struct {
Name []byte
Type uint8
Flag uint16
} type Resultset struct {
Status uint16 //server status for this query resultset Fields []Field
FieldNames map[string]int Data [][]interface{}
}

Field用来表示查询的时候返回的数据每列的名字,数据类型以及一些特定的Flag。而resultset中的Data则是存放了query结果中对于的实际数据。因为对于mysql select来说,它返回的是一个"m x n"的结果集,我们直接使用[][]interface{}在go中表示。

Resultset提供了非常方便的接口用于select数据的获取:

//指定某一行,某一列获取数据,结果为string
func (r *Resultset) GetString(row, column int) (string, error)
//执行某一行,某一列的名字获取数据,结果为string
func (r *Resultset) GetStringByName(row int, columnName int) (string, error)

接口

go-mysql除了query之外,几乎提供了与go database/sql一样的接口使用方式:

//创建一个db,最大允许保活16个空闲连接
//dsn格式为:<username>:<password>@<host>:<port>/<database>
db := NewDB("qing:admin@127.0.0.1:3306/mixer", 16) //ping一下,看mysql server是不是还是活的
db.Ping() //执行exec,包括insert,update,delete,replace
r, err := db.Exec("insert into mixer_conn (id, str) values (1, `abc`)")
println(r.LastInsertId(), r.RowsAffected()) //执行exec,语句中包含 ?占位符,需要传递相应的参数
r, err := db.Exec("insert into mixer_conn (id, str) values (?, ?)", 2, "efg")
println(r.LastInsertId(), r.RowsAffected()) //执行select,得到结果集,并获取相关数据
r, err := db.Query("select str from mixer_conn where id = 1")
str, _ = r.GetString(0, 0)
str, _ = r.GetStringByName(0, "str") //开始一个事物
tx, err = db.Begin() //在事物里面执行语句
tx.Exec("insert into mixer_conn (id, str) values (3, `abc`)") //提交事物
tx.Commit() //创建一个prepare statement
s, err := db.Prepare("insert into mixer_conn (id, str) values(?, ?)") //执行 prepare statement
s.Exec(5, "abc") //关闭 prepare statement
s.Close()

不光如此,go-mysql还提供单独获取一个conn,用于给外部额外使用的功能,譬如:

conn, err := db.GetConn()

//我需要设置conn的字符集为gb2312
conn.SetCharset("gb2312") conn.Close()

可以看到,go-mysql的使用非常简单,现阶段正逐渐在我们项目中使用,也非常期待您的反馈。

go-mysql,一个易用的mysql接口框架实现的更多相关文章

  1. MySQL - MySQL++在c++11环境下接口设计

    安装官方提供的mysqlconnect后,可以使用mysql++库,在官方的C API上再次做一个c++面向对象封装. 这里mysql++的安装依赖于mysql-connector-c.安装参考:ht ...

  2. mysql 一个较特殊的问题:You can't specify target table for update in FROM clause

    mysql 一个较特殊的问题:You can't specify target table for update in FROM clause 即:不能先select出同一表中的某些值,再update ...

  3. 一个参数引起的mysql从库宕机血案

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://suifu.blog.51cto.com/9167728/1859252 一个参数 ...

  4. 一个很好的MySQL在线学习平台

    一个很好的MySQL在线学习平台 https://www.techonthenet.com/sql/

  5. Mysql一个非常有用的内置函数今天碰到要把MySQL数据库中的varchar转换成date类型进

    Mysql一个非常有用的内置函数 今天碰到要把MySQL数据库中的varchar转换成date类型进行时间的比较和查询.在网上找了找,发现MySQL也跟其他数据库一样有自己内置的转换函数:str_to ...

  6. 单节点k8s的一个小例子 webapp+mysql

    安装kubernetes 准备一台centos7 1) 关闭firewalld 和 selinux systemctl stop firewalld systemctl disable firewal ...

  7. 如何使用MySQL一个表中的字段更新另一个表中字段

    [本文出自:https://www.jb51.net/article/150323.htm] 这篇文章主要介绍了如何使用MySQL一个表中的字段更新另一个表中字段,需要的朋友可以参考下 1,修改1列 ...

  8. 从一个慢查询到MySQL字符集编码

    从一个慢查询到MySQL字符集编码 目录 从一个慢查询到MySQL字符集编码 1. 问题起源 2. MySQL字符集和字符集排序规则 2.1 字符集相关概念 2.2 MySQL中的字符集和字符集排序规 ...

  9. MYSQL一个设备上的主从复制实现-windows

    只记录一次在一个设备上实现mysql主从复制的过程,很详细,建议收藏,用到的时候照着步骤做就可以,会记录所有需要注意到的细节和一些容易遇到的坑以及解决办法! 如果需要在同一台电脑(服务器)上实现mys ...

随机推荐

  1. 新手级配置 react react-router4.0 redux fetch sass

    前言 最近公司来了几个实习生,刚好我手头没什么要紧事,然后领导让我带他们学习react, 为下一个react项目做基础. 然后随手写了几个demo,帮助他们了解正经项目如何去构建配置项目. 现在分享出 ...

  2. Oracle中表字段相关操作举例

    --创建测试表 create or replace table student ( xh ), --学号 xm ), --姓名 sex ), --性别 birthday date, --日期 sal ...

  3. 剑指架构师系列-Nginx的安装与使用

    Nginx可以干许多事情,在这里我们主要使用Nginx的反向代理与负载均衡功能. 1.Nginx的下载安装 在安装Nginx前需要安装如下软件: GCC  Nginx是C写的,需要用GCC编译 PCR ...

  4. ACM Strange fuction

    现在,这里有一个功能:  F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100) 当x在0到100之间时,你能找到最小值吗? 输入 第一行包 ...

  5. Git 常用命令速查表(图文+表格)

    一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r ...

  6. 介绍Docker容器

    容器是 Docker 又一核心概念. 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用 ...

  7. springMVC源码解析--HandlerMethodArgumentResolverComposite参数解析器集合(二)

    上一篇博客springMVC源码分析--HandlerMethodArgumentResolver参数解析器(一)中我们已经介绍了参数解析相关的东西,并且也提到了HandlerMethodArgume ...

  8. Spinner控件详解

    Spinner控件详解 效果图 修改Spinner样式 在介绍之前,先看一下系统原生的样式 6.x & 5.x系统样式 4.x系统样式 官方文档 XML属性 方法 描述 android:dro ...

  9. Picasso 完美兼容 OkHttp3.3,缓存优化两不误

    Tamic 专注移动开发!更多文章请关注http://www.jianshu.com/p/6241950f9daf csdn: http://blog.csdn.net/sk719887916/art ...

  10. Java 单元测试 JUnit4 快速入门

    JUnit最佳实践 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class CardServiceTest {     /**      * 最佳 ...