fixed markdown format
This commit is contained in:
28
5.1.md
28
5.1.md
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user