学习了Go语言数据库编程-DDL语句基本语法(14天搞定Go语言,从0到1保姆级教程(第11天)Go语言数据库编程-数据库介绍、MySQL数据库的使用、MySQL数据类型、SQL基础入门),本篇将继续学习DML语句基本用法和DQL语句基本用法。另外,还会有Go程序操作MySQL数据库的学习。

SQL基础入门、Go程序操作MySQL数据库

学习目标

(1)能够掌握DML语句基本用法

(2)能够掌握DQL语句基本用法

(3)能够掌握Go程序操作MySQL数据库

知识讲解

SQL基础入门

Ø DML语句基本用法

1. 插入数据

插入新数据 INSERT 语法如下所示。

具体用法如下所示。

2.更新记录

更新数据 UPDATE 语法如下所示。

具体用法如下所示。

3.删除记录

删除数据:DELETE语法如下所示。

具体用法如下所示。

Ø DQL语句基本用法

1. 查询所有记录

SELECT 语法如下所示。

具体用法如下所示。

2. 按照一定的条件查找

按照条件查询的语法如下所示。

具体用法如下所示。

3.SQL高级查询

SQL的高级查询包括许多内容,包括SQL运算符、SQL函数的用法、不重复记录查询(distinct)、排序和限制查询(order by、limit)、分组聚合查询(group by)、多表连接查询(inner join、left join、right join)、子查询(in、not in、exists、any、all)等等。想仔细研究这部分内容的读者可以参考“好程序员”成长系列丛书 《MySQL从入门到精通》。

Ø 安装MySQL模块

Go官方提供了database包,database包下有sql/driver。该包用来定义操作数据库的接口,这保证了无论使用哪种数据库,他们的操作方式都是相同的。但go官方并没有提供连接数据库的driver,如果要操作数据库,还需要第三方的driver 包。

在安装MySQL模块之前需要先安装git,如果没有安装git,MySQL模块安装会失败。

下载安装MySQL驱动模块的步骤如下所示。

(1)Windows系统下载

安装:go install http://github.com/Go-SQL-Driver/MySQL,如图所示。

(2)Ubuntu下安装方式:执行下面两个命令

(3)下载后目录结构

目录结构如图所示。

Ø 导入包

示例代码如下所示。

Golang 提供了database/sql包,用于对SQL数据库的访问。它提供了一系列接口方法,用于访问关系数据库但它并不会提供数据库特有的方法,那些特有的方法交给数据库驱动去实现。

匿名导包——只导入包但是不使用包内的类型和数据,使用匿名导包的方式(在包路径前添加下划线 “_” )导入MySQL驱动。匿名导入的包与其他方式导入包一样,会让导入包编译到可执行文件中。通常来说, 导入包后就能调用该包中的数据和方法。但是对于数据库操作来说,开发者不应该直接使用导入的驱动包所提供的方法,而是应该使用 sql.DB对象所提供的统一的方法。因此在导入 mysql 驱动时,使用了匿名导入包的方式。当导入一个数据库驱动后,该驱动会自行初始化并注册到Golang的database/sql上下文中,这样就可以通过 database/sql 包所提供的方法来访问数据库了。

Ø 连接数据库

sql包中的Open()函数,原型如下所示。

driverName使用的驱动名。这个名字其实就是数据库驱动注册到 database/sql 时所使用的名字.

dataSourceName:数据库连接信息,这个连接包含了数据库的用户名,密码,数据库主机以及需要连接的数据库名等信息。

使用示例如下所示。

sql.Open()返回的sql.DB对象是协程并发安全的。sql.DB 通过数据库驱动为开发者提供管理底层数据库连接的打开和关闭操作。sql.DB 帮助开发者管理数据库连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果开发者没有把连接释放回连接池,会导致过多连接使系统资源耗尽。

sql.DB的设计就是用来作为长连接(一次链接多次数据交互)使用。不宜频繁开关。比较好的做法是,为每个不同的datastore建一个DB对象,保持这些对象打开。如果需要短连接(一次链接一次数据交互),就把DB作为参数传入function,而不要在function中开关。

Ø 增删改数据

直接调用DB对象的Exec()方法如下所示。

通过db.Exec()插入数据,通过返回的err可知插入失败的原因,通过返回的结果可以进一步查询本次插入数据影响的行数(RowsAffected)和最后插入的ID(如果数据库支持查询最后插入ID)。

Exec()方法的使用方式如下所示。

预编译语句(PreparedStatement)提供了诸多好处,,PreparedStatement 可以实现自定义参数的查询,通常来说,比手动拼接字符串 SQL 语句高效;PreparedStatement 还可以防止SQL注入攻击,大家在开发中尽量使用它。

通常使用Prepared Statements和Exec()完成INSERT、UPDATE、DELETE操作。使用DB对象的Prepare()方法获得预编译对象stmt,然后调用Exec()方法,语法如下所示。

具体使用方法如下所示。

获取影响数据库的行数,可以根据该数值判断是否操作(插入、删除或修改)成功。语法如下所示。

Ø 查询数据

数据库查询的一般步骤如下。

(1)调用 db.Query()方法执行SQL语句,此方法返回一个Rows作为查询结果,语法如下所示。

(2)将rows.Next()方法的返回值作为for循环的条件,迭代查询数据,语法如下所示。

(3)在循环中,通过 rows.Scan()方法读取每一行数据,语法如下所示。

(4)调用db.Close()关闭查询。

通过QueryRow()方法查询单条数据,语法如下所示。

整体步骤示例如下所示。

查询多行数据如下所示。

因为Golang是强类型语言,所以查询数据时先定义数据类型。数据库中的数据有3种状态:存在值、存在零值、未赋值,因此可以将待查询的数据类型定义为sql.NullString 、 sql.NullInt64类型等。可以通过Valid值来判断查询到的值是赋值状态还是未赋值状态。每次db.Query操作后, 都建议调用rows.Close()。

因为 db.Query() 会从数据库连接池中获取一个连接,这个底层连接在结果集(rows)未关闭前会被标记为处于繁忙状态。当遍历读到最后一条记录时,会发生一个内部EOF错误,自动调用rows.Close()。但如果出现异常,提前退出循环,rows不会关闭,连接不会回到连接池中,连接也不会关闭,则此连接会一直被占用。因此通常使用 defer rows.Close() 来确保数据库连接可以正确放回到连接池中。

阅读源码发现rows.Close()操作是幂等操作,而一个幂等操作的特点是:其任意多次执行所产生的影响与一次执行的影响相同。所以即便对已关闭的rows再执行close()也没关系。

Ø 示例代码

案例中的表结构如下所示。


Go语言数据库编程知识点总结

https://www.zhihu.com/video/1555492077521362945

介绍了MySQL相关知识,对MySQL数据库使用,支持的数据类型,数据库基本操作,数据表的基本操作以及对数据表中数据的基本操作进行了讲解,为后面学习Beego框架打下基础,本章内容比较多,大家需要多加练习,融会贯通。

PS:梳理了Go语言数据库编程-数据库介绍、MySQL数据库的使用、MySQL数据类型、SQL基础入门、Go程序操作MySQL数据库的笔记和视频教程若有不懂或者想要全部笔记的可私信交流哦~