Go 使用标准库 sql 包和三方数据库驱动包操作 MySQL

时间:2022-07-24
本文章向大家介绍Go 使用标准库 sql 包和三方数据库驱动包操作 MySQL,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

回滚事务。