fixed markdown format

This commit is contained in:
yetist
2012-10-28 21:00:50 +08:00
parent c3abc9b6c7
commit 81a61b9ced
59 changed files with 280 additions and 280 deletions

28
5.1.md
View File

@@ -1,7 +1,7 @@
#5.1 database/sql接口
# 5.1 database/sql接口
Go和PHP不同的地方是他没有官方提供数据库驱动而是为开发数据库驱动定义了一些标准接口第三方用户可以根据定义的接口来开发相应的数据库驱动这样做有一个好处我们按照标准接口开发的代码 在需要迁移数据库时不需要任何修改。那么Go都定义了那些标准接口呢让我们来详细的分析一下
##sql.Register
## sql.Register
这个存在于database/sql的函数是用来注册数据库驱动的当第三方开发者开发数据库驱动时都会实现init函数在init里面会调用这个`Register(name string, driver driver.Driver)`完成本驱动的注册。
我们来看一下mymysql、sqlite3的驱动里面都是怎么调用的
@@ -34,7 +34,7 @@ Go和PHP不同的地方是他没有官方提供数据库驱动而是为开
>
>新手都会被这个`_`所迷惑其实这个就是Go设计的巧妙之处我们在变量赋值的时候经常看到这个它是用来忽略变量的占位符那么这个包引入也是这儿的意思是引入此包而不直接使用这个包中定义的函数变量等资源我们在2.3流程和函数里面介绍过init函数的初始化过程包在引入的时候会去调用包的init函数以完成对包的初始化因此我们引入上面的数据库驱动包之后会去调用init函数然后在init函数里面注册了这个数据库驱动这样我们就可以在接下来的代码中直接使用这个数据库驱动了。
##driver.Driver
## driver.Driver
Driver是一个数据库驱动的接口他定义了一个method Open(name string)这个方法返回一个数据库的Conn接口。
type Driver interface {
@@ -52,7 +52,7 @@ Driver是一个数据库驱动的接口他定义了一个method Open(name
第三方驱动都会定义这个函数它会解析name参数来获取相关数据库的连接信息解析完成后它将使用此信息来初始化一个Conn并返回它。
##driver.Conn
## driver.Conn
Conn是一个数据库连接的接口定义他定义了一系列方法这个Conn只能应用在一个goroutine里面不能使用在多个goroutine里面详情请参考上面的说明。
type Conn interface {
@@ -67,7 +67,7 @@ Close函数关闭当前的连接以及执行释放连接拥有的资源等清
Begin函数返回一个代表事务处理的Tx通过它你可以进行查询,更新等操作,或者对事务进行回滚、递交。
##driver.Stmt
## driver.Stmt
Stmt是一种准备好的状态和Conn相关联而且是只能应用于一个goroutine中不能应用在多个goroutine中。
type Stmt interface {
@@ -86,7 +86,7 @@ Exec函数执行Prepare准备好的sql传入参数执行update/insert等操
Query函数执行Prepare准备好的sql传入需要的参数执行select操作返回Rows结果集
##driver.Tx
## driver.Tx
事务处理一般就两个过程,递交或者回滚。数据库驱动里面也只需要实现这两个函数就可以
type Tx interface {
@@ -96,7 +96,7 @@ Query函数执行Prepare准备好的sql传入需要的参数执行select操
这两个函数一个用来递交一个事务,一个用来回滚事务。
##driver.Execer
## driver.Execer
这是一个Conn可选择实现的接口
type Execer interface {
@@ -105,7 +105,7 @@ Query函数执行Prepare准备好的sql传入需要的参数执行select操
如果这个接口没有定义那么在调用DB.Exec,就会首先调用Prepare返回Stmt然后执行Stmt的Exec然后关闭Stmt。
##driver.Result
## driver.Result
这个是执行Update/Insert等操作返回的结果接口定义
type Result interface {
@@ -117,7 +117,7 @@ LastInsertId函数返回由数据库执行插入操作得到的自动增长ID号
RowsAffected函数返回query操作影响的数据条目数。
##driver.Rows
## driver.Rows
Rows是执行查询返回的结果集接口定义
type Rows interface {
@@ -136,7 +136,7 @@ Close函数用来关闭Rows迭代器。
Next函数用来返回下一条数据把数据赋值给dest。dest里面的元素必须是driver.Value的值除了string返回的数据里面所有的string都必须要转换成[]byte。如果最后没数据了Next函数最后返回io.EOF。
##driver.RowsAffected
## driver.RowsAffected
RowsAffested其实就是一个int64的别名但是他实现了Result接口用来底层实现Result的表示方式
type RowsAffected int64
@@ -145,7 +145,7 @@ RowsAffested其实就是一个int64的别名但是他实现了Result接口
func (v RowsAffected) RowsAffected() (int64, error)
##driver.Value
## driver.Value
Value其实就是一个空接口他可以容纳任何的数据
type Value interface{}
@@ -159,7 +159,7 @@ Value的值必须所有的驱动里面控制的Value要么是nil要么是
string [*]除了Rows.Next返回的不能是string.
time.Time
##driver.ValueConverter
## driver.ValueConverter
ValueConverter接口定义了如何把一个普通的值转化成driver.Value的接口
type ValueConverter interface {
@@ -172,7 +172,7 @@ ValueConverter接口定义了如何把一个普通的值转化成driver.Value的
- 把数据库查询结果转化成driver.Value值
- 在scan函数里面如何把dirve.Value值转化成用户定义的值
##driver.Valuer
## driver.Valuer
Valuer接口定义了返回一个driver.Value的方式
type Valuer interface {
@@ -182,7 +182,7 @@ Valuer接口定义了返回一个driver.Value的方式
通过上面的讲解,你应该对于驱动的开发有了一个基本的了解,一个驱动只要实现了这些接口就能完成增删查改等基本操作了,剩下的就是与相应的数据库进行数据交互等细节问题了,在此不再赘述。
##database/sql
## database/sql
database/sql在database/sql/driver提供的接口基础上定义了一些更高阶的方法用以简化数据库操作,同时内部还实现了一个建议的conn pool。
type DB struct {