01
概念
在 Go 语言中,sql 包提供了数据库的通用接口,并且 sql 包必须与数据库驱动包一起使用,Go 标准库中没有数据库驱动包,需要使用第三方的数据库驱动包。需要注意的是,写代码时不要忘记导入三方数据库驱动包。
sql 包的 Open 函数打开一个通过一个数据库驱动名称(driverName)和一个数据库驱动数据源名称(dataSourceName)指定的数据库,该数据源名称至少包含数据库连接信息和数据库名称,该函数返回 *DB。
Open 函数可能只是在不创建数据库连接的情况下验证其参数,如果想要验证数据源名称是否合法,需要调用 Ping 方法。
返回的 *DB 可以安全地供多个 goroutine 并发使用,并维护一个自己的空闲数据库连接池,因此,Open 函数应仅被调用一次,很少需要关闭数据库连接。
02
连接池 DB
DB 常用方法:
func (db *DB) Ping() error
Ping 方法用来验证数据库连接是否有效,并在必要时可以创建新的数据库连接。
func (db *DB) SetMaxOpenConns(n int)
SexMaxOpenConns 方法限制最大开启连接数,如果 n<=0,代表不限制开启连接数,默认值为 0,不限制;
如果 n 小于最大空闲连接数,将会把最大空闲连接数减小到与最大开启连接数一致。
func (db *DB) SetMaxIdleConns(n int)
SetMaxIdleConns 方法限制最大空闲连接数,如果 n<=0,代表不保留空闲连接,当前版本默认值为 2;
如果 n 大于最大开启连接数(最大开启连接数大于 0),将会把新的最大空闲连接数减小到与最大开启连接数一致。
func (db *DB) Begin() (*Tx, error)
开始一个事务,事务隔离级别取决于使用的三方数据库驱动包。
03
结果集 Result
常用方法:
func (Result) LastInsertId() (int64, error)
LastInsertId 方法返回数据库的数据表自增主键。
func (Result) RowsAffected() (int64, error)
RowsAffected 方法返回受更新,插入或删除影响的行数。
04
预声明 Stmt
常用方法:
func (s *Stmt) Exec(args ...interface{}) (Result, error)
Exec 用给定的参数执行一个预声明,并返回一个结果集。
func (s *Stmt) Close() error
Close 关闭预声明。
func (s *Stmt) QueryRow(args ...interface{}) *Row
QueryRow 方法使用给定的参数执行预处理好的查询语句。如果在执行语句期间发生错误,则该错误将通过在返回的 *Row 调用 Scan 来返回,该值始终为nil。如果查询未选择任何行,则 *Row 将返回ErrNoRows。否则,*Row 将返回所选的第一行,并丢弃其余的行。
func (s *Stmt) Query(args ...interface{}) (*Rows, error)
Query 方法使用给定的参数执行预处理的查询语句,并将查询结果作为 * Rows 返回。
05
查询结果 Row 和 Rows
常用方法:
func (r *Row) Scan(dest ...interface{}) error
Scan 方法将匹配的行中的列复制到 dest 指向的值中。如果与查询匹配的行超过一个,则Scan使用第一行并丢弃其余行。如果没有行与查询匹配,则 Scan返回 ErrNoRows。
func (rs *Rows) Next() bool
Next 方法准备下一个结果行,以使用 Scan 方法读取。如果成功,它将返回true;如果没有下一个结果行或在准备它时发生错误,则返回false。应调用 Rows 类型的 Err 方法来区分这两种情况。每次调用 Scan,甚至是第一个,都必须先调用 Next。
06
事务 Tx
常用方法:
func (tx *Tx) Commit() error
提交事务。
func (tx *Tx) Rollback() error
回滚事务。