文章目录
Install连接数据库需要的包
go get -u github.com/go-sql-driver/mysql // MySQL数据库的包
go get github.com/lib/pq // pg数据库的包
注意:不同数据库,安装的包不同
初始化连接
Open:函数只是验证连接参数是否正确
db.ping():测试是否能够正常连接数据库,返回nil
表示可以
全局定义db
变量是为了连t接数据库成功之后任意地方都可以进行操作。
引入 MySQL驱动包使用:_ "github.com/go-sql-driver/mysql"
当导入带有空白标识符前缀 _ 的包时,将调用包的 init 函数。该函数注册驱动程序
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
// 定义全局db对象
var db *sql.DB
func InitDB() (err error) {
// Data Source Name:连接MySQL的格式
dsn := "root:password@tcp(127.0.0.1:3306)/GoStudy"
// 注意!!!这里不要使用:=,我们是给全局变量赋值,然后在main函数中使用全局变量db
db, err = sql.Open("mysql", dsn)
if err != nil {
return err
}
// 尝试与数据库建立连接(校验dsn是否正确)
return db.Ping()
}
func main() {
if err := InitDB(); err != nil {
fmt.Println("连接失败")
return
}
// 数据库使用完之后关闭连接
defer db.Close()
}
其中sql.DB
是表示连接的数据库对象(结构体实例),它保存了数据库所有信息,内部维护了一个具有0到多个底层数据库连接池,它可以安全的被多个Goroutine
使用。因此Open
函数应该仅被调用一次,很少需要关闭这个对象
连接池
SetMaxOpenConns
func (db *DB) SetMaxOpenConns(n int)
SetMaxOpenConns
设置与数据库建立连接的最大数目。 如果n大于0且小于最大闲置连接数,会将最大闲置连接数减小到匹配最大开启连接数的限制。 如果n<=0,不会限制最大开启连接数,默认为0(无限制)。需要MySQL服务器的max_connections参数值要小,可以用以下SQL查询
show variables like 'max_connections';
SetMaxIdleConns
func (db *DB) SetMaxIdleConns(n int)
SetMaxIdleConns设置连接池中的最大闲置连接数。 如果n大于最大开启连接数,则新的最大闲置连接数会减小到匹配最大开启连接数的限制。 如果n<=0,不会保留闲置连接。需要比maxOpenConns小
SetConnMaxIdleTime
连接池里面的连接最大空闲时长(一个连接不活跃的时长)。
SetConnMaxLifetime
连接池里面的连接最大存活时长。必须要比mysql服务器设置的wait_timeout小,否则会导致golang侧连接池依然保留已被mysql服务器关闭了的连接。
MySQL默认是8小时,可通过以下SQL查询
show variables like 'wait_timeout';
查询数据
单行数据查询
通过QueryRow
方法实现
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
type User struct {
Id int
Name string
Pwd string
Age int
Sex string
}
func InitDB() (err error) {
// Da