go语言的sql包原理与用法分析

本文实例讲述了go语言的sql包原理与用法。分享给大家供大家参考,具体如下:

go的sql包是在pkg/database中,里面的两个包sql和sql/driver可以一起看。建议看这个两个包之前可以先看看sql文件夹下的doc.txt。这个文档说了几点比较重要的:

1 这两个包是真正Go风格的包。

2 这使用这两个包就不需要关于并发处理了,也不需要维护自己的数据库连接池了,一旦建立了一个连接,这个连接是可以在各个goroutine之间共用的。

3 sql/driver提供的是数据库的接口,具体的实现还需要自己实现。

先看database/driver包

第一个用到的方法是Register

这个方法将实现了driver.Driver的驱动注册到变量drivers中,当写完一个驱动之后,就需要将驱动注册到sql中才能使用sql包中的这些接口。这个实现了driver.Driver的必须实现了Open方法.

driver.Open返回的是driver.Conn,它的三个方法

Prepare : 参数绑定
Close : 关闭连接
Begin : 支持事务

先看Prepare,这个和php mysql pdo一样的用法

Conn.Prepare("select * from test where a=?")

返回的Stmt结构:

Close : 关闭这个statement
NumInput : 返回有多少个可以绑定的参数
Exec : Insert或者update等无返回的使用
Query :select等查询操作使用
Exec是绑定变量,然后返回Result结构
Query是绑定变量,然后返回Rows结果集

看Result里面的方法:

LastInsertId()  : Insert操作之后获取到的主键id
RowsAffect() : 影响到的行数
Rows:
Columns() : 返回的数据有哪些列,其实就是返回的表列名
Close() : 关闭Rows,调用之后不能再进行任何操作
Next() : 将下一行的数据取到des[] Value中。这里的Value接口可以是int64,float64,bool,[]byte,string,time.Time

下面回到Begin,返回了Tx

开始事务之后除了查询之外,就两种行为:Commit和Rollback,这两种行为都是Tx接口的方法

drvier中的结构全是接口性质的,它需要你来实现并注册到Register中。

驱动的具体使用是在database/sql中

首先将几个sql的结构看一遍

首先sql中的结构都是对driver中的结构进行了一层封装,比如像Rows,有个内部属性是rowsi driver.Rows。

对sql的实际操作都是使用driver.Rows里面的接口进行操作的,实际也就是使用你自己实现的driver进行操作。

driver和sql就像插头和一个充满插头的汽车一样,你实现了driver,即实现了这些插头的配置,你就可使用sql这个汽车了。

Result : 和driver中的Result一致,即你如果实现了driver.Result,那你自然就实现了sql.Result。它是个接口,其实没有什么特殊的用处,如果sql包中的所有Result都换成driver.Result也是行的,估计是作者希望返回值不要引用到其他包去,就使用这种方法。

Rows :  基于了driver.Rows, 还在上面扩展了几个其他的方法。拥有方法:

Close
Cloumns
Err
Next
Scan
Stmt :基于driver.Stmt。拥有方法
Close
Exec
Query
QueryRow
Tx:基于driver.Tx。拥有方法:
Commit
Exec
Prepare
Query
QueryRow
Rollback
Stmt

从sql.Open开始

返回了sql.DB结构,这个结构是实现了driver.Conn结构,除了Conn已有的Prepare,Begin,Close之外,还直接多了几个查询方法:

Driver() : 返回当前驱动
Exec() : 直接进行操作
Query() : 进行查询,返回Rows
QueryRow() : 预期返回单行,返回Row

不管Rows还是Row都有个很好用的方法Scan来将数据放到制定的变量中去。

比如下面就是典型的Rows用法

代码如下:

rows, err := db.Query("SELECT ...")
...
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
...
}

Prepare返回Stmt结构

Exec返回Result结构

至于这几个结构也有各自的方法。

希望本文所述对大家Go语言程序设计有所帮助。

(0)

相关推荐

  • 在Go语言程序中使用gojson来解析JSON格式文件

    gojson是快速解析json数据的一个golang包,你使用它可以快速的查找json内的数据 安装 go get github.com/widuu/gojson 使用简介 结构 复制代码 代码如下: type Js struct {     data interface{} } (1) func Json(data) *Js data为string类型,初始化Js结构,解析json并且return Js.data 复制代码 代码如下: json := `{"from":"e

  • golang实现sql结果集以json格式输出的方法

    本文实例讲述了golang实现sql结果集以json格式输出的方法.分享给大家供大家参考,具体如下: 复制代码 代码如下: func getJSON(sqlString string) (string, error) {     stmt, err := db.Prepare(sqlString)     if err != nil {         return nil, err     }     defer stmt.Close()     rows, err := stmt.Query

  • Go语言操作mysql数据库简单例子

    Go语言操作数据库非常的简单, 他也有一个类似JDBC的东西"database/sql" 实现类是"github.com/go-sql-driver/mysql" 使用过JDBC的人应该一看就懂 对日期的处理比较晦涩,没有JAVA流畅: 复制代码 代码如下: package main import (     "database/sql"     _ "github.com/go-sql-driver/mysql"     &

  • go语言通过odbc操作Access数据库的方法

    本文实例讲述了go语言通过odbc操作Access数据库的方法.分享给大家供大家参考.具体如下: 这里需要用到go-odbc库,下载地址为:https://github.com/weigj/go-odbc 复制代码 代码如下: package main; import (  "fmt"  "database/sql"  _"odbc/driver" ) func main(){  conn,err := sql.Open("odbc&q

  • Go语言对JSON进行编码和解码的方法

    本文实例讲述了Go语言对JSON进行编码和解码的方法.分享给大家供大家参考.具体如下: json已成为不同平台间传送数据的最佳方式,Golang对json的支持非常好,代码如下: 复制代码 代码如下: package main import (     "fmt"     "encoding/json" ) func main() {     // json encode     j1 := make(map[string]interface{})     j1[&

  • go语言通过odbc访问Sql Server数据库的方法

    本文实例讲述了go语言通过odbc访问Sql Server数据库的方法.分享给大家供大家参考.具体如下: 这里需要用到go-odbc库,开源地址为:https://github.com/weigj/go-odbc 复制代码 代码如下: package main; import (     "fmt"     "database/sql"     _"odbc/driver" ) func main(){     conn,err := sql.O

  • Go语言中转换JSON数据简单例子

    Go语言转换JSON数据真是非常的简单. 以EasyUI的Demo为例,将/demo/datagrid/datagrid_data1.json 拷贝到$GOPATH/src目录: JSON.go: 复制代码 代码如下: package main import (         "encoding/json"         "fmt"         "io/ioutil" ) type product struct {         Pro

  • go语言读取json并下载高清妹子图片

    学了一天golang,一边看文档一边写的go读取分析json并下载图片 json api为爱壁纸HD mac 1920x1200版本,高清妹子图 总结:go+json=shit package main import ( "fmt" "io" "io/ioutil" "net/http" "os" "path/filepath" "strconv" //"e

  • Go语言使用MySql的方法

    本文实例讲述了Go语言中使用MySql的方法.分享给大家供大家参考.具体如下: 此代码需要先安装mysql的go语言驱动. 首先安装mysql的go语言驱动: 复制代码 代码如下: go get github.com/ziutek/mymysql/godrv 示例代码如下: 复制代码 代码如下: package users import (     "database/sql"     "fmt"     _ "github.com/ziutek/mymy

  • go语言的sql包原理与用法分析

    本文实例讲述了go语言的sql包原理与用法.分享给大家供大家参考,具体如下: go的sql包是在pkg/database中,里面的两个包sql和sql/driver可以一起看.建议看这个两个包之前可以先看看sql文件夹下的doc.txt.这个文档说了几点比较重要的: 1 这两个包是真正Go风格的包. 2 这使用这两个包就不需要关于并发处理了,也不需要维护自己的数据库连接池了,一旦建立了一个连接,这个连接是可以在各个goroutine之间共用的. 3 sql/driver提供的是数据库的接口,具体

  • PHP设计模式之适配器模式原理与用法分析

    本文实例讲述了PHP设计模式之适配器模式原理与用法.分享给大家供大家参考,具体如下: 一.什么是适配器模式 适配器模式有两种:类适配器模式和对象适配器模式.其中类适配器模式使用继承方式,而对象适配器模式使用组合方式.由于类适配器模式包含双重继承,而PHP并不支持双重继承,所以一般都采取结合继承和实现的方式来模拟双重继承,即继承一个类,同时实现一个接口.类适配器模式很简单,但是与对象适配器模式相比,类适配器模式的灵活性稍弱.采用类适配器模式时,适配器继承被适配者并实现一个接口:采用对象适配器模式时

  • PHP设计模式之原型设计模式原理与用法分析

    本文实例讲述了PHP设计模式之原型设计模式原理与用法.分享给大家供大家参考,具体如下: 一.什么是原型设计模式 原型设计模式使用一种克隆技术来复制实例化的对象,新对象是通过复制原型实例创建的.原型设计模式的目的是通过使用克隆以减少 实例化对象的开销. 在原型设计模式中,Client类是不可缺少的一部分. PHP有一个内置的克隆方法__clone()可以在设计模式中使用,但是不能直接访问,使用clone关键字即可.克隆不会启动构造函数. 二.什么时候使用原型设计模式 如果一个项目要求你创建某个原型

  • PHP的Trait机制原理与用法分析

    本文实例讲述了PHP的Trait机制原理与用法.分享给大家供大家参考,具体如下: Trait介绍: 1.自PHP5.4起,PHP实现了一种代码复用的方法,称为trait. 2.Trait是为类似PHP的单继承语言二准备的一种代码复用机制. 3.Trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method. 4.trait实现了代码的复用,突破了单继承的限制: 5.trait是类,但是不能实例化. 6.当类中方法重名时,优先级,当前类>trait>父类; 7

  • PHP 构造函数和析构函数原理与用法分析

    本文实例讲述了PHP 构造函数和析构函数原理与用法.分享给大家供大家参考,具体如下: 构造函数 __construct ([ mixed $args [, $... ]] ) : void PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作. Note: 如果子类中定义了构造函数则不会隐式调用其父类的构造函数.要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct

  • Yii中srbac权限扩展模块工作原理与用法分析

    本文实例讲述了Yii中srbac权限扩展模块工作原理与用法.分享给大家供大家参考,具体如下: 1. 设置权限规则表:可放在module模块配置文件里面 public function init() { //操作权限表,必须存在以下字段: //itemname角色名/ID, //type授权项目类型/1(任务)或者2(角色), //bizrule权限/逻辑运算表达式为false是有权限操作, //data数据/YII暂无利用 Yii::app()->authManager->itemTable

  • JavaScript函数柯里化原理与用法分析

    本文实例讲述了JavaScript函数柯里化原理与用法.分享给大家供大家参考,具体如下: 柯里化是这样的一个转换过程,把接受多个参数的函数变换成接受一个单一参数(译注:最初函数的第一个参数)的函数,如果其他的参数是必要的,返回接受余下的参数且返回结果的新函数. 也就是说是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了缩小适用范围,创建一个针对性更强的函数. 例如,我想创建一个做自我介绍的函数,每个人只要输入自己姓名.性别.年龄即可.但是当A使用这个函数时,每次调用,都必

  • PHP面向对象自动加载机制原理与用法分析

    本文实例讲述了PHP面向对象自动加载机制原理与用法.分享给大家供大家参考,具体如下: 在学习PHP的面向对象的时候,会知道很多"语法糖",也就是魔术方法.有一个加自动加载的魔术方法,叫:__autoload(); 先看一段代码 <?php function __autoload($classname) { $filename = "./". $classname .".php"; include_once($filename); } new

  • thinkPHP框架自动填充原理与用法分析

    本文实例分析了thinkPHP框架自动填充原理与用法.分享给大家供大家参考,具体如下: thinkphp有一个自动填充字段的方法 填充规则如下 array( array(完成字段1,完成规则,[完成条件,附加规则]), array(完成字段2,完成规则,[完成条件,附加规则]), ...... ); 注:研究源码后发现其实还有第4个参数,是给函数或者回调方法传参数用的,参数1默认为该字段值,如: array('mobile','trim',3,'function',参数2,参数3'), 验证支付

  • Python装饰器原理与用法分析

    本文实例讲述了Python装饰器原理与用法.分享给大家供大家参考,具体如下: 1.装饰器的本质是函数,主要用来装饰其他函数,也就是为其他函数添加附加功能 2.装饰器的原则: (1) 装饰器不能修改被装饰的函数的源代码 (2) 装饰器不能修改被装饰的函数的调用方式 3.实现装饰器的知识储备 (1) Python中函数即'变量' a.变量在Python中的存储 x='Tomwenxing' y=x [说明]: 当Python解释器遇到语句x='Tomwenxing'时,它主要完成了两样工作: 1.在

随机推荐