sql.DB 通过数据库驱动为我们提供管理底层数据库连接的打开和关闭操作.
sql.DB 为我们管理数据库连接池
需要注意的是,sql.DB表示操作数据库的抽象访问接口,而非一个数据库连接对象;它可以根据driver打开关闭数据库连接,管理连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果你没有把连接释放回连接池,会导致过多连接使系统资源耗尽。
操作mysql
1.导入mysql数据库驱动
1
2
3
4
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
通常来说, 不应该直接使用驱动所提供的方法, 而是应该使用 sql.DB, 因此在导入 mysql 驱动时, 这里使用了匿名导入的方式(在包路径前添加 _), 当导入了一个数据库驱动后, 此驱动会自行初始化并注册自己到Golang的database/sql上下文中, 因此我们就可以通过 database/sql 包提供的方法访问数据库了.
2.连接数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type DbWorker struct {
//mysql data source name
Dsn string
}
func main() {
dbw := DbWorker{
Dsn: "user:password@tcp(127.0.0.1:3306)/test",
}
db, err := sql.Open("mysql",
dbw.Dsn)
if err != nil {
panic(err)
return
}
defer db.Close()
}
通过调用sql.Open函数返回一个sql.DB指针; sql.Open函数原型如下:
1
func Open(driverName, dataSourceName string) (*DB, error)
driverName: 使用的驱动名. 这个名字其实就是数据库驱动注册到 database/sql 时所使用的名字.
dataSourceName: 数据库连接信息,这个连接包含了数据库的用户名, 密码, 数据库主机以及需要连接的数据库名等信息.
sql.Open并不会立即建立一个数据库的网络连接, 也不会对数据库链接参数的合法性做检验, 它仅仅是初始化一个sql.DB对象. 当真正进行第一次数据库查询操作时, 此时才会真正建立网络连接;
sql.DB表示操作数据库的抽象接口的对象,但不是所谓的数据库连接对象,sql.DB对象只有当需要使用时才会创建连接,如果想立即验证连接,需要用Ping()方法;
sql.Open返回的sql.DB对象是协程并发安全的.
sql.DB的设计就是用来作为长连接使用的。不要频繁Open, Close。比较好的做法是,为每个不同的datastore建一个DB对象,保持这些对象Open。如果需要短连接,那么把DB作为参数传入function,而不要在function中Open, Close。
3.数据库基本操作
数据库查询的一般步骤如下:
调用 db.Query 执行 SQL 语句, 此方法会返回一个 Rows 作为查询的结果
通过 row