修复统一err

This commit is contained in:
astaxie
2012-09-12 14:57:33 +08:00
parent 403e7e4fff
commit 57fcd45f7c
4 changed files with 74 additions and 73 deletions

24
5.1.md
View File

@@ -67,7 +67,7 @@ Close函数关闭当前的连接以及执行释放连接拥有的资源等清
Begin函数返回一个代表事务处理的Tx通过它你可以进行查询,更新等操作,或者对事务进行回滚、递交。 Begin函数返回一个代表事务处理的Tx通过它你可以进行查询,更新等操作,或者对事务进行回滚、递交。
##drive.Stmt ##driver.Stmt
Stmt是一种准备好的状态和Conn相关联而且是只能应用于一个goroutine中不能应用在多个goroutine中。 Stmt是一种准备好的状态和Conn相关联而且是只能应用于一个goroutine中不能应用在多个goroutine中。
type Stmt interface { type Stmt interface {
@@ -86,7 +86,7 @@ Exec函数执行Prepare准备好的sql传入参数执行update/insert等操
Query函数执行Prepare准备好的sql传入需要的参数执行select操作返回Rows结果集 Query函数执行Prepare准备好的sql传入需要的参数执行select操作返回Rows结果集
##drive.Tx ##driver.Tx
事务处理一般就两个过程,递交或者回滚。数据库驱动里面也只需要实现这两个函数就可以 事务处理一般就两个过程,递交或者回滚。数据库驱动里面也只需要实现这两个函数就可以
type Tx interface { type Tx interface {
@@ -96,7 +96,7 @@ Query函数执行Prepare准备好的sql传入需要的参数执行select操
这两个函数一个用来递交一个事务,一个用来回滚事务。 这两个函数一个用来递交一个事务,一个用来回滚事务。
##drive.Execer ##driver.Execer
这是一个Conn可选择实现的接口 这是一个Conn可选择实现的接口
type Execer interface { type Execer interface {
@@ -105,7 +105,7 @@ Query函数执行Prepare准备好的sql传入需要的参数执行select操
如果这个接口没有定义那么在调用DB.Exec,就会首先调用Prepare返回Stmt然后执行Stmt的Exec然后关闭Stmt。 如果这个接口没有定义那么在调用DB.Exec,就会首先调用Prepare返回Stmt然后执行Stmt的Exec然后关闭Stmt。
##drive.Result ##driver.Result
这个是执行Update/Insert等操作返回的结果接口定义 这个是执行Update/Insert等操作返回的结果接口定义
type Result interface { type Result interface {
@@ -117,7 +117,7 @@ LastInsertId函数返回由数据库执行插入操作得到的自动增长ID号
RowsAffected函数返回query操作影响的数据条目数。 RowsAffected函数返回query操作影响的数据条目数。
##drive.Rows ##driver.Rows
Rows是执行查询返回的结果集接口定义 Rows是执行查询返回的结果集接口定义
type Rows interface { type Rows interface {
@@ -133,10 +133,10 @@ Columns函数返回查询数据库表的字段信息这个返回的slice和
Close函数用来关闭Rows迭代器。 Close函数用来关闭Rows迭代器。
Next函数用来返回下一条数据把数据赋值给dest。dest里面的元素必须是drive.Value的值除了string返回的数据里面所有的string都必须要转换成[]byte。如果最后没数据了Next函数最后返回io.EOF。 Next函数用来返回下一条数据把数据赋值给dest。dest里面的元素必须是driver.Value的值除了string返回的数据里面所有的string都必须要转换成[]byte。如果最后没数据了Next函数最后返回io.EOF。
##drive.RowsAffected ##driver.RowsAffected
RowsAffested其实就是一个int64的别名但是他实现了Result接口用来底层实现Result的表示方式 RowsAffested其实就是一个int64的别名但是他实现了Result接口用来底层实现Result的表示方式
type RowsAffected int64 type RowsAffected int64
@@ -145,7 +145,7 @@ RowsAffested其实就是一个int64的别名但是他实现了Result接口
func (v RowsAffected) RowsAffected() (int64, error) func (v RowsAffected) RowsAffected() (int64, error)
##drive.Value ##driver.Value
Value其实就是一个空接口他可以容纳任何的数据 Value其实就是一个空接口他可以容纳任何的数据
type Value interface{} type Value interface{}
@@ -159,7 +159,7 @@ Value的值必须所有的驱动里面控制的Value要么是nil要么是
string [*]除了Rows.Next返回的不能是string. string [*]除了Rows.Next返回的不能是string.
time.Time time.Time
##drive.ValueConverter ##driver.ValueConverter
ValueConverter接口定义了如何把一个普通的值转化成driver.Value的接口 ValueConverter接口定义了如何把一个普通的值转化成driver.Value的接口
type ValueConverter interface { type ValueConverter interface {
@@ -168,11 +168,11 @@ ValueConverter接口定义了如何把一个普通的值转化成driver.Value的
在开发的数据库驱动包里面实现这个接口的函数在很多地方会使用到这个ValueConverter有很多好处 在开发的数据库驱动包里面实现这个接口的函数在很多地方会使用到这个ValueConverter有很多好处
- 转化drive.value到数据库表相应的字段例如int64的数据如何转化成数据库表uint16字段 - 转化driver.value到数据库表相应的字段例如int64的数据如何转化成数据库表uint16字段
- 把数据库查询结果转化成drive.Value值 - 把数据库查询结果转化成driver.Value值
- 在scan函数里面如何把dirve.Value值转化成用户定义的值 - 在scan函数里面如何把dirve.Value值转化成用户定义的值
##drive.Valuer ##driver.Valuer
Valuer接口定义了返回一个driver.Value的方式 Valuer接口定义了返回一个driver.Value的方式
type Valuer interface { type Valuer interface {

43
5.2.md
View File

@@ -34,7 +34,7 @@ Go中支持MySQL的驱动目前比较多有如下几种有些是支持data
如下示例将示范如何使用database/sql接口对数据库表进行增删改查操作 如下示例将示范如何使用database/sql接口对数据库表进行增删改查操作
package main package main
import ( import (
_ "code.google.com/p/go-mysql-driver/mysql" _ "code.google.com/p/go-mysql-driver/mysql"
@@ -48,31 +48,31 @@ Go中支持MySQL的驱动目前比较多有如下几种有些是支持data
checkErr(err) checkErr(err)
//插入数据 //插入数据
stmt, errs := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?") stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
checkErr(errs) checkErr(err)
res, errres := stmt.Exec("astaxie", "研发部门", "2012-12-09") res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
checkErr(errres) checkErr(err)
id, errid := res.LastInsertId() id, err := res.LastInsertId()
checkErr(errid) checkErr(err)
fmt.Println(id) fmt.Println(id)
//更新数据 //更新数据
stmt, errs = db.Prepare("update userinfo set username=? where uid=?") stmt, err = db.Prepare("update userinfo set username=? where uid=?")
checkErr(errs) checkErr(err)
res, errres = stmt.Exec("astaxieupdate", id) res, err = stmt.Exec("astaxieupdate", id)
checkErr(errres) checkErr(err)
affect, erraff := res.RowsAffected() affect, err := res.RowsAffected()
checkErr(erraff) checkErr(err)
fmt.Println(affect) fmt.Println(affect)
//查询数据 //查询数据
rows, errrow := db.Query("SELECT * FROM userinfo") rows, err := db.Query("SELECT * FROM userinfo")
checkErr(errrow) checkErr(err)
for rows.Next() { for rows.Next() {
var uid int var uid int
@@ -88,14 +88,14 @@ Go中支持MySQL的驱动目前比较多有如下几种有些是支持data
} }
//删除数据 //删除数据
stmt, errrow = db.Prepare("delete from userinfo where uid=?") stmt, err = db.Prepare("delete from userinfo where uid=?")
checkErr(errrow) checkErr(err)
res, errres = stmt.Exec(id) res, err = stmt.Exec(id)
checkErr(errres) checkErr(err)
affect, erraff = res.RowsAffected() affect, err = res.RowsAffected()
checkErr(erraff) checkErr(err)
fmt.Println(affect) fmt.Println(affect)
@@ -107,6 +107,7 @@ Go中支持MySQL的驱动目前比较多有如下几种有些是支持data
} }
} }
通过上面的代码我们可以看出Go操作Mysql数据库是很方便的。 通过上面的代码我们可以看出Go操作Mysql数据库是很方便的。
关键的几个函数我解释一下: 关键的几个函数我解释一下:

40
5.3.md
View File

@@ -43,31 +43,31 @@ Go支持sqlite的驱动也比较多但是好多都是不支持database/sql接
checkErr(err) checkErr(err)
//插入数据 //插入数据
stmt, errs := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?") stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
checkErr(errs) checkErr(err)
res, errres := stmt.Exec("astaxie", "研发部门", "2012-12-09") res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
checkErr(errres) checkErr(err)
id, errid := res.LastInsertId() id, err := res.LastInsertId()
checkErr(errid) checkErr(err)
fmt.Println(id) fmt.Println(id)
//更新数据 //更新数据
stmt, errs = db.Prepare("update userinfo set username=? where uid=?") stmt, err = db.Prepare("update userinfo set username=? where uid=?")
checkErr(errs) checkErr(err)
res, errres = stmt.Exec("astaxieupdate", id) res, err = stmt.Exec("astaxieupdate", id)
checkErr(errres) checkErr(err)
affect, erraff := res.RowsAffected() affect, err := res.RowsAffected()
checkErr(erraff) checkErr(err)
fmt.Println(affect) fmt.Println(affect)
//查询数据 //查询数据
rows, errrow := db.Query("SELECT * FROM userinfo") rows, err := db.Query("SELECT * FROM userinfo")
checkErr(errrow) checkErr(err)
for rows.Next() { for rows.Next() {
var uid int var uid int
@@ -83,14 +83,14 @@ Go支持sqlite的驱动也比较多但是好多都是不支持database/sql接
} }
//删除数据 //删除数据
stmt, errrow = db.Prepare("delete from userinfo where uid=?") stmt, err = db.Prepare("delete from userinfo where uid=?")
checkErr(errrow) checkErr(err)
res, errres = stmt.Exec(id) res, err = stmt.Exec(id)
checkErr(errres) checkErr(err)
affect, erraff = res.RowsAffected() affect, err = res.RowsAffected()
checkErr(erraff) checkErr(err)
fmt.Println(affect) fmt.Println(affect)

40
5.4.md
View File

@@ -51,33 +51,33 @@ package main
checkErr(err) checkErr(err)
//插入数据 //插入数据
stmt, errs := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid") stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid")
checkErr(errs) checkErr(err)
res, errres := stmt.Exec("astaxie", "研发部门", "2012-12-09") res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
checkErr(errres) checkErr(err)
//pg不支持这个函数因为他没有类似MySQL的自增ID //pg不支持这个函数因为他没有类似MySQL的自增ID
id, errid := res.LastInsertId() id, err := res.LastInsertId()
checkErr(errid) checkErr(err)
fmt.Println(id) fmt.Println(id)
//更新数据 //更新数据
stmt, errs = db.Prepare("update userinfo set username=$1 where uid=$2") stmt, err = db.Prepare("update userinfo set username=$1 where uid=$2")
checkErr(errs) checkErr(err)
res, errres = stmt.Exec("astaxieupdate", 1) res, err = stmt.Exec("astaxieupdate", 1)
checkErr(errres) checkErr(err)
affect, erraff := res.RowsAffected() affect, err := res.RowsAffected()
checkErr(erraff) checkErr(err)
fmt.Println(affect) fmt.Println(affect)
//查询数据 //查询数据
rows, errrow := db.Query("SELECT * FROM userinfo") rows, err := db.Query("SELECT * FROM userinfo")
checkErr(errrow) checkErr(err)
for rows.Next() { for rows.Next() {
var uid int var uid int
@@ -93,14 +93,14 @@ package main
} }
//删除数据 //删除数据
stmt, errrow = db.Prepare("delete from userinfo where uid=$1") stmt, err = db.Prepare("delete from userinfo where uid=$1")
checkErr(errrow) checkErr(err)
res, errres = stmt.Exec(1) res, err = stmt.Exec(1)
checkErr(errres) checkErr(err)
affect, erraff = res.RowsAffected() affect, err = res.RowsAffected()
checkErr(erraff) checkErr(err)
fmt.Println(affect) fmt.Println(affect)