修复统一err
This commit is contained in:
24
5.1.md
24
5.1.md
@@ -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
43
5.2.md
@@ -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
40
5.3.md
@@ -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
40
5.4.md
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user