前言:Go标准库下的database/sql包为我们操作各类数据库提供了一个统一操作的接口,各大数据库开发商据此包提供相关的数据库驱动实现。我们开发者下载安装所需驱动,调用sql包下相关api即可对数据库操作。其优点为不同数据库的操作可公用一套代码,切换驱动包即可。
一,加载数据库驱动,测试链接是否正常
- 到官网下载mysql驱动到本地 (以mysql数据库为列)https://github.com/go-sql-driver/mysql
- 匿名导入数据库驱动包,注册驱动
- Open(driverName,dsn)方法校验俩参数是否正确,返回数据库操作句柄*DB
注:
1.dsn为操作的数据库资源名称,格式为 [username[:password]@][protocol[(address)]]/dbname[?param1=value1&…¶mN=valueN]
详情可到https://github.com/go-sql-driver/mysql 查看.
2.sql.Open()方法只是做参数的校验(即驱动名是否与注册的驱动相同),并没有打开一个数据库链接。我们可到源码的注释里可以看到:
// Open may just validate its arguments without creating a connection
// to the database. To verify that the data source name is valid, call
// Ping. - Ping()方法测试数据库是否链接成功(校验dsn参数是否正确有效)
Open,Ping方法调用过程可简记为【两参校验法】,即driverName,dsn参数校验。只有在这两步都成功后后续数据库的CURD才能相继展开。
二,数据库的CURD
1. 非查询类的api操作
非查询类顾名思义即为增删改相关的数据库操作,使用Db.Exec(sql,…interface{})方法来实现,sql语句即为增删改的语句,参数二为需要传入sql语句里的值。方法返回Result一个结构体对象其包含了一个获取受影响行数和获取该条记录id的方法。
- Db.Exec(sql,…interface{}) 增删改业务执行的方法,传入相关sql语句执行即可
- Db.Prepare(sql),Stmt.Exec() ,Stmt.Close() 预编译处理,多次执行
2. 查询类的api操作
- 单条查询
- Db.QueryRow() 查询一条记录,返回Row结果
- row.Scan() 将查询到的记录值扫描到传入参数中
- 多条查询
- Db.Query() 查询多条记录,返回Rows结果集
- rows.Next() 移动到下一条记录,以便Scan()读取
- row.Scan() 读取记录的字段值到参数
- rows.Close() 关闭资源
3. 数据库null值的处理
1.因为数据库字段的值可能存在设置为可null的情况,而Go语言是强类型的语言在其基础数据类型中没有匹配null的数据类型。此时我们可以用database/sql包下提供的NullString,NullFloat64,NullInt32,NullBool,NullTime结构体类型来代替相关变量的数据类型,来解决此问题。
2.其中各结构体里有两个成员变量,一个是各自类型的变量值,一个bool类型的Valid(当其值不为null时为true)。
4. 预编译,预处理sql
一次编译,多次执行。eg:循环执行插入
- func (db *DB) Prepare(query string) (*Stmt, error) //预编译sql
- func (s *Stmt) Exec(args …interface{}) (Result, error) //stmt对象来传入参数执行
- func (s *Stmt) Close() error //关闭资源
- 当然还有单查询和多条查询也可以先预编sql。对于多次的执行来提高执行效率
三,事务
- func (db *DB) Begin() (*Tx, error) 开始事务
- func (tx *Tx) Commit() error 提交事务
- func (tx *Tx) Rollback() error 回滚中止事务
以上就是本篇文章【Go - 数据库原生操作包database/sql】的全部内容了,欢迎阅览 ! 文章地址:http://ww.kub2b.com/tnews/3681.html 栏目首页 相关文章 动态 同类文章 热门文章 网站地图 返回首页 企库往资讯移动站 http://ww.kub2b.com/mobile/ , 查看更多