From 57fcd45f7c3af64a595699654c4885df31993f4e Mon Sep 17 00:00:00 2001 From: astaxie Date: Wed, 12 Sep 2012 14:57:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=9F=E4=B8=80err?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 5.1.md | 24 ++++++++++++------------ 5.2.md | 43 ++++++++++++++++++++++--------------------- 5.3.md | 40 ++++++++++++++++++++-------------------- 5.4.md | 40 ++++++++++++++++++++-------------------- 4 files changed, 74 insertions(+), 73 deletions(-) diff --git a/5.1.md b/5.1.md index 3e9b5afc..a3d863e6 100644 --- a/5.1.md +++ b/5.1.md @@ -67,7 +67,7 @@ Close函数关闭当前的连接,以及执行释放连接拥有的资源等清 Begin函数返回一个代表事务处理的Tx,通过它你可以进行查询,更新等操作,或者对事务进行回滚、递交。 -##drive.Stmt +##driver.Stmt Stmt是一种准备好的状态,和Conn相关联,而且是只能应用于一个goroutine中,不能应用在多个goroutine中。 type Stmt interface { @@ -86,7 +86,7 @@ Exec函数执行Prepare准备好的sql,传入参数执行update/insert等操 Query函数执行Prepare准备好的sql,传入需要的参数执行select操作,返回Rows结果集 -##drive.Tx +##driver.Tx 事务处理一般就两个过程,递交或者回滚。数据库驱动里面也只需要实现这两个函数就可以 type Tx interface { @@ -96,7 +96,7 @@ Query函数执行Prepare准备好的sql,传入需要的参数执行select操 这两个函数一个用来递交一个事务,一个用来回滚事务。 -##drive.Execer +##driver.Execer 这是一个Conn可选择实现的接口 type Execer interface { @@ -105,7 +105,7 @@ Query函数执行Prepare准备好的sql,传入需要的参数执行select操 如果这个接口没有定义,那么在调用DB.Exec,就会首先调用Prepare返回Stmt,然后执行Stmt的Exec,然后关闭Stmt。 -##drive.Result +##driver.Result 这个是执行Update/Insert等操作返回的结果接口定义 type Result interface { @@ -117,7 +117,7 @@ LastInsertId函数返回由数据库执行插入操作得到的自动增长ID号 RowsAffected函数返回query操作影响的数据条目数。 -##drive.Rows +##driver.Rows Rows是执行查询返回的结果集接口定义 type Rows interface { @@ -133,10 +133,10 @@ Columns函数返回查询数据库表的字段信息,这个返回的slice和 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的表示方式 type RowsAffected int64 @@ -145,7 +145,7 @@ RowsAffested其实就是一个int64的别名,但是他实现了Result接口, func (v RowsAffected) RowsAffected() (int64, error) -##drive.Value +##driver.Value Value其实就是一个空接口,他可以容纳任何的数据 type Value interface{} @@ -159,7 +159,7 @@ Value的值必须所有的驱动里面控制的,Value要么是nil,要么是 string [*]除了Rows.Next返回的不能是string. time.Time -##drive.ValueConverter +##driver.ValueConverter ValueConverter接口定义了如何把一个普通的值转化成driver.Value的接口 type ValueConverter interface { @@ -168,11 +168,11 @@ ValueConverter接口定义了如何把一个普通的值转化成driver.Value的 在开发的数据库驱动包里面实现这个接口的函数在很多地方会使用到,这个ValueConverter有很多好处: -- 转化drive.value到数据库表相应的字段,例如int64的数据如何转化成数据库表uint16字段 -- 把数据库查询结果转化成drive.Value值 +- 转化driver.value到数据库表相应的字段,例如int64的数据如何转化成数据库表uint16字段 +- 把数据库查询结果转化成driver.Value值 - 在scan函数里面如何把dirve.Value值转化成用户定义的值 -##drive.Valuer +##driver.Valuer Valuer接口定义了返回一个driver.Value的方式 type Valuer interface { diff --git a/5.2.md b/5.2.md index a4a09cc3..925b416a 100644 --- a/5.2.md +++ b/5.2.md @@ -34,7 +34,7 @@ Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持data 如下示例将示范如何使用database/sql接口对数据库表进行增删改查操作 - package main +package main import ( _ "code.google.com/p/go-mysql-driver/mysql" @@ -48,31 +48,31 @@ Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持data checkErr(err) //插入数据 - stmt, errs := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?") - checkErr(errs) + stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?") + checkErr(err) - res, errres := stmt.Exec("astaxie", "研发部门", "2012-12-09") - checkErr(errres) + res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09") + checkErr(err) - id, errid := res.LastInsertId() - checkErr(errid) + id, err := res.LastInsertId() + checkErr(err) fmt.Println(id) //更新数据 - stmt, errs = db.Prepare("update userinfo set username=? where uid=?") - checkErr(errs) + stmt, err = db.Prepare("update userinfo set username=? where uid=?") + checkErr(err) - res, errres = stmt.Exec("astaxieupdate", id) - checkErr(errres) + res, err = stmt.Exec("astaxieupdate", id) + checkErr(err) - affect, erraff := res.RowsAffected() - checkErr(erraff) + affect, err := res.RowsAffected() + checkErr(err) fmt.Println(affect) //查询数据 - rows, errrow := db.Query("SELECT * FROM userinfo") - checkErr(errrow) + rows, err := db.Query("SELECT * FROM userinfo") + checkErr(err) for rows.Next() { var uid int @@ -88,14 +88,14 @@ Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持data } //删除数据 - stmt, errrow = db.Prepare("delete from userinfo where uid=?") - checkErr(errrow) + stmt, err = db.Prepare("delete from userinfo where uid=?") + checkErr(err) - res, errres = stmt.Exec(id) - checkErr(errres) + res, err = stmt.Exec(id) + checkErr(err) - affect, erraff = res.RowsAffected() - checkErr(erraff) + affect, err = res.RowsAffected() + checkErr(err) fmt.Println(affect) @@ -107,6 +107,7 @@ Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持data } } + 通过上面的代码我们可以看出,Go操作Mysql数据库是很方便的。 关键的几个函数我解释一下: diff --git a/5.3.md b/5.3.md index e7c2b582..9a7c43b5 100644 --- a/5.3.md +++ b/5.3.md @@ -43,31 +43,31 @@ Go支持sqlite的驱动也比较多,但是好多都是不支持database/sql接 checkErr(err) //插入数据 - stmt, errs := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?") - checkErr(errs) + stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?") + checkErr(err) - res, errres := stmt.Exec("astaxie", "研发部门", "2012-12-09") - checkErr(errres) + res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09") + checkErr(err) - id, errid := res.LastInsertId() - checkErr(errid) + id, err := res.LastInsertId() + checkErr(err) fmt.Println(id) //更新数据 - stmt, errs = db.Prepare("update userinfo set username=? where uid=?") - checkErr(errs) + stmt, err = db.Prepare("update userinfo set username=? where uid=?") + checkErr(err) - res, errres = stmt.Exec("astaxieupdate", id) - checkErr(errres) + res, err = stmt.Exec("astaxieupdate", id) + checkErr(err) - affect, erraff := res.RowsAffected() - checkErr(erraff) + affect, err := res.RowsAffected() + checkErr(err) fmt.Println(affect) //查询数据 - rows, errrow := db.Query("SELECT * FROM userinfo") - checkErr(errrow) + rows, err := db.Query("SELECT * FROM userinfo") + checkErr(err) for rows.Next() { var uid int @@ -83,14 +83,14 @@ Go支持sqlite的驱动也比较多,但是好多都是不支持database/sql接 } //删除数据 - stmt, errrow = db.Prepare("delete from userinfo where uid=?") - checkErr(errrow) + stmt, err = db.Prepare("delete from userinfo where uid=?") + checkErr(err) - res, errres = stmt.Exec(id) - checkErr(errres) + res, err = stmt.Exec(id) + checkErr(err) - affect, erraff = res.RowsAffected() - checkErr(erraff) + affect, err = res.RowsAffected() + checkErr(err) fmt.Println(affect) diff --git a/5.4.md b/5.4.md index 105f8f11..229559f8 100644 --- a/5.4.md +++ b/5.4.md @@ -51,33 +51,33 @@ package main checkErr(err) //插入数据 - stmt, errs := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid") - checkErr(errs) + stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid") + checkErr(err) - res, errres := stmt.Exec("astaxie", "研发部门", "2012-12-09") - checkErr(errres) + res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09") + checkErr(err) //pg不支持这个函数,因为他没有类似MySQL的自增ID - id, errid := res.LastInsertId() - checkErr(errid) + id, err := res.LastInsertId() + checkErr(err) fmt.Println(id) //更新数据 - stmt, errs = db.Prepare("update userinfo set username=$1 where uid=$2") - checkErr(errs) + stmt, err = db.Prepare("update userinfo set username=$1 where uid=$2") + checkErr(err) - res, errres = stmt.Exec("astaxieupdate", 1) - checkErr(errres) + res, err = stmt.Exec("astaxieupdate", 1) + checkErr(err) - affect, erraff := res.RowsAffected() - checkErr(erraff) + affect, err := res.RowsAffected() + checkErr(err) fmt.Println(affect) //查询数据 - rows, errrow := db.Query("SELECT * FROM userinfo") - checkErr(errrow) + rows, err := db.Query("SELECT * FROM userinfo") + checkErr(err) for rows.Next() { var uid int @@ -93,14 +93,14 @@ package main } //删除数据 - stmt, errrow = db.Prepare("delete from userinfo where uid=$1") - checkErr(errrow) + stmt, err = db.Prepare("delete from userinfo where uid=$1") + checkErr(err) - res, errres = stmt.Exec(1) - checkErr(errres) + res, err = stmt.Exec(1) + checkErr(err) - affect, erraff = res.RowsAffected() - checkErr(erraff) + affect, err = res.RowsAffected() + checkErr(err) fmt.Println(affect)