driver.Driver
Driver 是一个数据库驱动的接口,他定义了一个 method: Open (name string),这个方法返回一个数据库的 Conn 接口。
type Driver interface {
Open(name string) (Conn, error)
}
返回的 Conn 只能用来进行一次 goroutine 的操作,也就是说不能把这个 Conn 应用于 Go 的多个 goroutine 里面。如下代码会出现错误
...
go goroutineA (Conn) // 执行查询操作
go goroutineB (Conn) // 执行插入操作
...
上面这样的代码可能会使 Go 不知道某个操作究竟是由哪个 goroutine 发起的,从而导致数据混乱,比如可能会把 goroutineA 里面执行的查询操作的结果返回给 goroutineB 从而使 B 错误地把此结果当成自己执行的插入数据。
第三方驱动都会定义这个函数,它会解析 name 参数来获取相关数据库的连接信息,解析完成后,它将使用此信息来初始化一个 Conn 并返回它。
driver.Stmt
Stmt 是一种准备好的状态,和 Conn 相关联,而且只能应用于一个 goroutine 中,不能应用于多个 goroutine。
type Stmt interface {
Close() error
NumInput() int
Exec(args []Value) (Result, error)
Query(args []Value) (Rows, error)
}
Close 函数关闭当前的链接状态,但是如果当前正在执行 query,query 还是有效返回 rows 数据。
NumInput 函数返回当前预留参数的个数,当返回 >=0 时数据库驱动就会智能检查调用者的参数。当数据库驱动包不知道预留参数的时候,返回 -1。
Exec 函数执行 Prepare 准备好的 sql,传入参数执行 update/insert 等操作,返回 Result 数据
Query 函数执行 Prepare 准备好的 sql,传入需要的参数执行 select 操作,返回 Rows 结果集