go编程之mysql操作
xixionedream · · 3777 次点击 · · 开始浏览
针对Go语言的数据库编程,Go标准库中针对此并没有对应的数据库操作包来直接操作目前主流的数据库,但在database/sql中封装了标准的数据库操作接口,其中包括有:
sql.Register 用于 go包中init函数中,用来注册数据库驱动如(不同数据库注册方式有所差异):
https://github.com/mattn/go-sqlite3
func init(){
sql.Register("sqlite3",&SQLiteDriver{})
} sql.Open 打开数据库连接,返回driver.Driver即数据库的Conn接口
Conn,err = sql.Open(...)
diver.Stmt是一种数据库操作的准备状态,与Conn相关联
stmt,err := Conn.Prepare(....sql)
driver.Tx 事务处理的两个过程接口定义,包括递交或回滚
type Tx interface{
Commit() error
Rollback() error
}driver.Execer driver.Conn实现的接口,用来执行SQL查询语句
driver.Result执行Insert或者Update返回后的结果接口定义
type Result interface{
LastInsertId() (int64,error)
RowsAffected() (int64,error)
}driver.Rows执行查询返回的结果集接口定义type Rows interface{
Columns() []string
Close() errorNext(dest []Value) error }driver.RowsAffected, int64的别名,实现了Result接口
driver.Value 是interface{}接口,可以兼容任意数据类型
driver.ValueConverter 接口定义了ConvertValue(v interface{}) (Value,error)方法,实现普通值到driver.Value的转化
接下来看下mysql数据库使用示例:
首先需要准备go开发环境、mysql数据库,我的环境为eclipse、go1.3(windows)
安装git工具,配置环境变量,cmd下执行go get github.com/Go-SQL-Driver/MySQL获取go的Mysql库,默认会下载源码和库到GOPATH环境变量配置的第一个路径中
进入代码:(go数据库插入数据编写)
package main
import (
"fmt"
_ "github.com/Go-SQL-Driver/MySQL"
"database/sql"
)
func main() {
fmt.Printf("---open link-------------------------------------------------")
db, err := sql.Open("mysql","root:691214@tcp(localhost:3306)/opaq?charset=utf8")
checkErr(err)
//insert data
fmt.Printf("----init sql------------------------------------------------")
stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
checkErr(err)
fmt.Printf("------exec insert----------------------------------------------")
id, err := stmt.Exec("rjx","基础服务部","2015年4月10日")
checkErr(err)
fmt.Printf("---------4-------------------------------------------")
fmt.Println(id)
//update data
stmt,err := db.Prepare("update userinfo set username=? where uid=?")
checkErr(err)
res,err := stmt.Exec("rjx",id)
checkErr(err)
affect,err := res.RowsAffected()
checkErr(err)
fmt.Println(affect)
//query data
rows,err := db.Query("Select * from userinfo")
checkErr(err)
for rows.Next(){
var uid int
var username string
var departname string
var created sting
err = rows.Scan(&uid,&username,&departname,&created)
checkErr(err)
fmt.Println(uid)
fmt.Println(username)
fmr.Println(depaetname)
fmt.Println(created)
}
//delete data
stmt,err := db.Prepare("delete from userinfo where uid=?")
checkErr(err)
res,err := stmt.Exec(id)
checkErr(err)
affect,err := res.RowsAffected()
checkErr(err)
fmt.Println(affect)
db.Close()
}
func checkErr(err error){
if err != nil{
panic(err)
}
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
针对Go语言的数据库编程,Go标准库中针对此并没有对应的数据库操作包来直接操作目前主流的数据库,但在database/sql中封装了标准的数据库操作接口,其中包括有:
sql.Register 用于 go包中init函数中,用来注册数据库驱动如(不同数据库注册方式有所差异):
https://github.com/mattn/go-sqlite3
func init(){
sql.Register("sqlite3",&SQLiteDriver{})
} sql.Open 打开数据库连接,返回driver.Driver即数据库的Conn接口
Conn,err = sql.Open(...)
diver.Stmt是一种数据库操作的准备状态,与Conn相关联
stmt,err := Conn.Prepare(....sql)
driver.Tx 事务处理的两个过程接口定义,包括递交或回滚
type Tx interface{
Commit() error
Rollback() error
}driver.Execer driver.Conn实现的接口,用来执行SQL查询语句
driver.Result执行Insert或者Update返回后的结果接口定义
type Result interface{
LastInsertId() (int64,error)
RowsAffected() (int64,error)
}driver.Rows执行查询返回的结果集接口定义type Rows interface{
Columns() []string
Close() errorNext(dest []Value) error }driver.RowsAffected, int64的别名,实现了Result接口
driver.Value 是interface{}接口,可以兼容任意数据类型
driver.ValueConverter 接口定义了ConvertValue(v interface{}) (Value,error)方法,实现普通值到driver.Value的转化
接下来看下mysql数据库使用示例:
首先需要准备go开发环境、mysql数据库,我的环境为eclipse、go1.3(windows)
安装git工具,配置环境变量,cmd下执行go get github.com/Go-SQL-Driver/MySQL获取go的Mysql库,默认会下载源码和库到GOPATH环境变量配置的第一个路径中
进入代码:(go数据库插入数据编写)
package main
import (
"fmt"
_ "github.com/Go-SQL-Driver/MySQL"
"database/sql"
)
func main() {
fmt.Printf("---open link-------------------------------------------------")
db, err := sql.Open("mysql","root:691214@tcp(localhost:3306)/opaq?charset=utf8")
checkErr(err)
//insert data
fmt.Printf("----init sql------------------------------------------------")
stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
checkErr(err)
fmt.Printf("------exec insert----------------------------------------------")
id, err := stmt.Exec("rjx","基础服务部","2015年4月10日")
checkErr(err)
fmt.Printf("---------4-------------------------------------------")
fmt.Println(id)
//update data
stmt,err := db.Prepare("update userinfo set username=? where uid=?")
checkErr(err)
res,err := stmt.Exec("rjx",id)
checkErr(err)
affect,err := res.RowsAffected()
checkErr(err)
fmt.Println(affect)
//query data
rows,err := db.Query("Select * from userinfo")
checkErr(err)
for rows.Next(){
var uid int
var username string
var departname string
var created sting
err = rows.Scan(&uid,&username,&departname,&created)
checkErr(err)
fmt.Println(uid)
fmt.Println(username)
fmr.Println(depaetname)
fmt.Println(created)
}
//delete data
stmt,err := db.Prepare("delete from userinfo where uid=?")
checkErr(err)
res,err := stmt.Exec(id)
checkErr(err)
affect,err := res.RowsAffected()
checkErr(err)
fmt.Println(affect)
db.Close()
}
func checkErr(err error){
if err != nil{
panic(err)
}
}