第八讲中我们介绍了如何使用Gin写一些常用的接口,本讲我们主要介绍一下数据库的操作。这一讲没有具体页面,大多数编程结果检验是通过控制台(命令行)或者数据可视化客户端,可能对于传统前端工程师会不太习惯。
连接数据库
首先我们要搭建一个MySQL数据库环境。如果不会的话可以参考这个教程。
https://www.jianshu.com/p/3a0de5da49f3,在搭建完成MySQL,并且启动MySQL之后。数据的管理员账户名设置成root,数据库密码设置为00000000。因为后续我们在代码中使用的数据库相关代码,会以这个为准.
我们可以通过mysql -h 127.0.0.1 -P 3306 -u root -p 000000000 指令来连接刚刚搭建在本机上的数据库。127.0.0.1为本机IP,3306为数据库具体端口,root为数据库用户名,000000000为数据库密码。在我们执行了这段代码之后,就会看到下图。
紧接着我们需要创建数据库和实验表,数据库的名字我们就叫做go_test。实验表的名字叫做t_1。在此之前我们先看一下数据库中都有哪些库,通过在连接数据库之后,在控制台执行show databases;来观察。执行结果如下图,有五个数据库。
information_schema数据库:信息数据库是关于数据的数据,如数据库名或表名,列的数据类型或者访问权限等。information_schema是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。在information_schema中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。
mysql数据库:这个是mysql的核心数据库,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,强烈建议不要更改个表的东西。(我们的用户名root和密码00000000也存储在这歌数据库的user表中)
performance_schema数据库:该数据库主要关注数据库运行过程中的性能相关的数据,一般情况下不需要关注。
sys数据库:其所有的数据源来自:performance_schema。目标是把performance_schema的把复杂度降低。
platform(某项目私人测试数据库)。
执行完创建数据库的语句后,我们再执行show database;就能看到我们刚刚创建的数据库——go_test。然后进入我们刚刚创建的go_test数据库(在控制台执行use go_test),这个时候在控制台上会看到Database changed的提示语,告知我们数据库切换已经成功。
接下来我们需要创建一个用于测试的数据库表"t_1"。并且这在这个表中有两列数据,一列叫做id,另一例叫做name。具体的代码如下:
执行上列命令之后我们就会在控制台看到如下信息,其中第一行代码含义是,CREATE TABLE `数据库名`.`表名`,之后两行SQL语句是数据库中两列的数据描述。
创建数据库表之后,对于数据的增、查、改、删就不通过简单的SQL语句的方式了,毕竟大多数时候开发后端需求,需要通过后端动态语言的方式来对数据做更改。
还是老规矩复制一下gotest4项目,重新命名gotest5,然后把main.go中的代码更改如下:
在代码中 _ "http://github.com/go-sql-driver/mysql"为Go语言连接mysql的驱动。
"database/sql"为Go语言操作的API。具体的操作API可以观察官方文档https://golang.org/pkg/database/sql/
在代码中最关键的代码是下面这行代码。
其中mysql为数据库的连接方式,root为数据库名称,tcp为连接数据库形式,127.0.0.1:3306为数据库IP地址和数据库端口,go_test为我们要连接的数据。 DB变量为返回的数据库连接,err为连接数据库时返回的错误信息(如果DB.Ping()连接失败的情况下 ,就直接返回错误信息,并且输出"open database fail")。反之,数据库连接成功后输出,"connnect success",接下来让我们执行一下main.go的代码,看看是不是这样,执行go run main.go,执行结果如下图。
下面我们介绍一下如何在我们创建的数据库表中,往t_1表中添加数据。
数据添加
首先,我们在main.go中创建一个InsertUser函数,这个函数主要功能是往我们刚刚创建t_1中添加一条数据。具体代码如下:
// 添加数据库数据
让我们介绍一下代码片段中的关键部分,tx为一个MySQL的事务对象(MySQL的事务概念可以自行百度,这里用一句简单的话来表述就是要么事务内的操作都成功,要么就是都不成功,保证数据库操作的完整性的)。
tx.Prepare为频繁操作时使用的函数,主要是为了缓存MySQL操作使得MySQL操作更高效。
目前我们学习database/sql提供两类查询操作,Query和Exec方法(本讲这两种方法都会使用到)。他们都可以使用plaintext和preprea方式查询。对于后者,可以有效的避免数据库注入。
plaintext形式:rows,err:=db.Query("SELECT * FROM user WHERE gid = 1")
preprea形式:rows,err:=db.Query("SELECT * FROM user WHERE gid = ?",1)
stmt.Exec表示执行语句,它不会返回行。DB的类型为:*sql.DB,有了DB之后我们就可以执行CRUD操作。Go将数据库操作分为两类:Query与Exec。两者的区别在于前者会返回结果,而后者不会。
tx.Commit()就是实际执行该MySQL的事务主题。至于代码中的User类的定义如下:
这里有一个定义方法type,下面我们介绍一下type的功能。
定义一个类
定义接口
// 定义自定义类型
// 可以设置别名
// 类型开关(我们可以把它理解TS中的any类型,但是不一样的地方是any本身是一种类型,但是interface不是一种类型,是任何类型的代名词)
下面我们把main.go文件中的代码都显示出来,代码具体如下。
在执行了代码之后,就能看到如下界面,没有输出tx fail、Prepare fail或Exec fail就证明我们的代码层面没有问题。
那么我们要看一下数据库中到底有没有,在此推荐两款MySQL可视化工具(Navicat、WorkBench),下图中是Navicat的界面,我们可以观察到我们刚刚创建的数据库、表和添加的数据。(MySQL可视化工具使用方式,请自行获取)
为了后续操作方便,我们顺便添加李四、王五两条数据。接下来我们看一下,如何通过代码的方式查询我们刚刚添加的数据,创建QueryUser函数。具体代码如下:
执行代码后,就会在控制台看到如下信息:在控制台上删除了,1 id 张三。就是我们在上面代码片段中 fmt.Printf("%d id %s\n", user.id, user.name)输出的数据。
本次查询操作没有使用事务的方式进行封装,仅仅是常规的查询操作,之所以这么做,是让大家了解其他的方式。但是在平时的真实开发场景中还是建议大家使用事务组装的开发模式。
数据更改
接下来我们要做数据更改的操作,但是在做更改操作之前,我们先关注一下数据中当前的数据是什么样的。通过Navicat观察如下图:
然后我们需要在main函数中,调用下面的UpdateUser函数,在UpdateUser中除了MySQL语句不同,我们还用到一个新的函数RowsAffected(),这个函数的主要的作用是在我们做某些操作的时候,比如:查询、更改、删除数据库操作的时候,返回本次MySQL操作涉及到多少条数据。
执行上面代码之后,我们先观察控制台部分,如下图,控制台打印出了更改成功。另外我们也可以看到控制台框出部分,这就是rowsaffected函数展示的此次操作影响的数据。
紧接着我们打开Navicat,可以看到id为1的数据的name属性变成张三改了。
数据删除
最后我们来看一下如何删除MySQL中的数据,有过前面增、查、改之后,删除操作就显得更加简单了,直接看下面的代码就可以了。
//删除数据
在执行成功了之后,我们观察控制台和数据库。
至此关于数据库的所有基本操作都介绍完毕了,本讲内容较多,我们介绍了数据库的连接、数据表内容的增、查、改、删操作,并且介绍了操作中的一些常用函数的用法。下一讲,我们讲介绍另一种非常常用的存储形式Redis的连接方法和使用注意事项。
下面我把本讲的主要main.go的全函数模块提供给大家,方便大家调试使用。
陈辰(CC老师) 978563552@qq.com