Go语言标准库中有两个包和DB操作相关,database/sql和database/sql/driver。
sql包提供了保证SQL或类SQL数据库的泛用接口。
driver包定义了应被数据库驱动实现的接口,这些接口会被sql包使用。
一、SQL操作
1、下载驱动
Go语言标准库提供的两个包都是相关接口,要连接数据库还需要相关驱动程序。
以操作MYSQL为例,需要的驱动可以通过go get命令在github上下载。
go get github.com/go-sql-driver/mysql
下载下来的驱动包会存放在Gopath下。
2、sql操作
程序中需要导入两个包。
mysql驱动包只需要引入init()函数就行。
import (
"database/sql"
//通过_引入init()函数
_"github.com/go-sql-driver/mysql"//驱动初始化
)
//初始函数给mysql注册了驱动
func init() {
sql.Register("mysql", &MySQLDriver{})
}
1、连接驱动格式
在sql包下的Open函数中,需要连接数据库的驱动。格式如下
"mysql", "username:password@tcp(127.0.0.1:3306)/db_name?charset=utf8"
2、准备数据库
准备好数据库。
3、查询
package main
import (
"database/sql"
"fmt"
_"github.com/go-sql-driver/mysql"
)
func main() {
db, _ := sql.Open("mysql", "root:xxxxxx@tcp(127.0.0.1:3306)/study?charset=utf8")
defer db.Close()//defer关闭数据库连接
//查询表、返回*Rows,其中存放着数据信息
rows, _ := db.Query("select * from xxx")
defer rows.Close()//defer关闭查询连接
//获取列相关信息
strings, _ := rows.Columns()
for i:=0;i< len(strings);i++{
fmt.Print(" ",strings[i])
}
fmt.Println()
var id int
var name string
var sex string
var about string
for rows.Next(){
rows.Scan(&id,&name,&sex,&about)//将一行数据放入参数中
fmt.Println(id,name,sex,about)
}
}
4、插入、删除、更新
func (*DB) [Exec]
func (db *DB) Exec(query string, args ...interface{}) (Result, error)
Exec执行一次命令(包括查询、删除、更新、插入等),不返回任何执行结果。参数args表示query中的占位参数。
db, _ := sql.Open("mysql", "root:xxxxxx@tcp(127.0.0.1:3306)/study?charset=utf8")
defer db.Close()//defer关闭数据库连接
query:="insert into stu(id, name, sex, about) values(10,'陈浩南','男','物理')"
db.Exec(query)//执行语句
5、事务
sql也支持事务,包括提交、回滚等。
tx, _ := db.Begin()//事务
tx.Exec("delete from stu where id=19")
tx.Commit()//提交
二、sql和driver
go语言标准库中提供的两个包。
1、sql/driver包
driver包定义了应被数据库驱动实现的接口,这些接口会被sql包使用。
type [Driver]
驱动接口
type Driver interface {
// Open返回一个新的与数据库的连接,参数name的格式是驱动特定的。
//
// Open可能返回一个缓存的连接(之前关闭的连接),但这么做是不必要的;
// sql包会维护闲置连接池以便有效的重用连接。
//
// 返回的连接同一时间只会被一个go程使用。
Open(name string) (Conn, error)
}
type [Conn]
连接接口
type Conn interface {
// Prepare返回一个准备好的、绑定到该连接的状态。
Prepare(query string) (Stmt, error)
// Close作废并停止任何现在准备好的状态和事务,将该连接标注为不再使用。
//
// 因为sql包维护着一个连接池,只有当闲置连接过剩时才会调用Close方法,
// 驱动的实现中不需要添加自己的连接缓存池。
Close() error
// Begin开始并返回一个新的事务。
Begin() (Tx, error)
}
type [Execer]
执行接口
type Execer interface {
Exec(query string, args []Value) (Result, error)
}
type [Queryer]
查询接口
type Queryer interface {
Query(query string, args []Value) (Rows, error)
}
type [Tx]
事务接口
type Tx interface {
Commit() error
Rollback() error
}
2、sql包
sql包提供了保证SQL或类SQL数据库的泛用接口。
提供了一些实现了driver包下的接口的结构体类型。
type [DB]
type DB struct {
// 内含隐藏或非导出字段
}
方法有:
Exec()/Query()/Close()等
type [Rows]
type Rows struct {
// 内含隐藏或非导出字段
}
方法有:
Scan()/Next()/Columns()等
|
请发表评论