00:00
下面呢,哎,我们来说一下怎么样来通过这个够来连接我们的数据库,也就是对数据库的一个操作来看操作数据库。购员中的database circle这个包,诶我们需要用到这个包了,上午呢,我们这个创建服务器用了一个,嗯,哪个包啊,Net http对吧?诶现在又用到了另外一个包,所以啊,今天晚上呢,你好好的把这两个包看一下,里边都有哪些方法,诶你可以自己的研究一下啊,诶尤其是我们重点说的怎么来创建这个处理系统呢,应该,诶等一会儿呢,我也会给大家把这个笔记呢给做一下啊,做完之后呢,诶这个我会把那个笔记呢给你高亮一下,他这个印象笔记高亮是怎么回事呢?他会在这个哪一块呢?给你加一个颜色啊,就加个黄色的东西,也就说这个大家以后就看那个黄色就可以了。啊,Database这个呢,用这个包,这个包定义了对数据库的一系列操作,哎,Database circle另外一个包driver中定义了,诶,应被数据库驱动实现的接口,也就这个包里边啊,定义了一些接口,也就是这个呃,实现对数据规定资产压的一些接口啊,这个包里边定义了对它里边的一个一系列操作啊相当于这个包里边就是规范,规范给你定义好规范了,那你这个如果有这个驱动,比如这个呃,连麦circle的或者连Oracle的,你必须得实现我这个circle driver这个包里边这些内容啊,就这个意思啊,这些接口呢,会被circle包使用,就这个。
01:28
定义接定义规范的这个专要里边这些呢,呃,接口呢,会被这个circleq包里边的使用啊,但是go语言没有提供任何官方的数据库驱动也有go呢,给你提供了个规范接口,诶给你提供了这个色Q包,诶对这个数据库进行了一系列操作调的一些方法都给你提供了,但是这个驱动没有实没有提供,也就是说对MYS的这个实现呢,对Oracle的这实现呢,对这个driver接口里边这些实现呢,它没有给你提供,那怎么办呢?我们需要导第三方的一个一些包了,一些驱动了啊哎,因为它没有任何的官方数据库驱动,所以呢,我们需要导入第三方的数据库驱动,诶不过我们连接数据库之后,对数据库的操作大部分代码都使用这个SQ包,也就调方法查询的方法,增删改的方法,查询一行的,查询所有行的,诶包括扫描的等等,都是掉这个SQ包里边的。
02:21
好,下边啊给大家举了几个,呃,写了一个连数库数据库的一个工具类啊,一个工具,一个工具,创建一个DB.go这个文件,导入这个database,哎,Circle这个包,以及第三方的驱动包,那这个呢,我们这个用的第三方的驱动包啊,是从这个getub上面下载一个go-circle-driver,哎,谁杠买circle这个包,这个包你们应该没有对吧。哎,我这个就是他啊,Go circle driver,哎,我把它呢,已经放到了我的工作空间里边。哎,在这一个我的project这个工作文件里边啊,比如这一个GOGO里边,这个SC里边有个giub.com,哎,我已经都放到这里边了啊go gun driver,哎我用了我已经放进去了,所以呢,我一会可以直接倒,那你那没有,你是不是得放到你那个公众空间里边了,对吧?哎,我现在呢,哎,我把这个就发给你啊,一会一会发吧,一会让让你这个写的会候再发啊把这个驱动的发给你,发给你之后呢,你在input这块把它导进去,导进去你这个路径不要写错了啊,你放到SI下,你可以在前面再创建一个这个这个包,这个知道吧。
03:29
我给你发的是go杠,Circle gun driver,就发的这个文件夹,那前面这些文件夹,如果你要想写的跟我一样,是不是你得自己创建呢?哎,如果没有你自己创建啊,或者说你这个不创建这个也行啊,不创建这个也行,你这个直接导这个也可以啊,然后下面呢,我定义了两个全局变量。哎,这一个一个DB这个类型的是,哎,这个指质类型的一个4Q点DB,一会我们会看这个方法啊,会看这个为什么要这样,为什么这样L定那个这个错误啊,定一个错误,防止它体的出现错误嘛,啊下边呢,这块这块就是这个结构体了啊DB的一个结构体里边什么都没有,来看一下它这个介绍。
04:05
DB是一个数据库操作聚柄,代表一个具有零到多个底层连接的一个连接池,哎,它可以安全的被多个构成与同时使用,哎,同使用这块啊,这个呢,SQ包会自动创建和释放链接,也就是说不像我们之前这个写其他用用其他语言的时候啊,这个后续链接时候呢,我还得调close来关这个连接,那这块呢,这个不用你操心了,哎,我这个S狗包呢,会自动创建和释放这个连接啊链接它也会维护一个闲置的连接的连接池,哎,所以在里边什么都有了,之前可能用其他语言说,还得用第三方的什么连接池,包括什么C3B0的呀,还有什么德鲁伊的呀等等啊,用那些连接池,现在呢,这些都不用你自己来整啊,DB里边都有啊,DB里边你说这个勾呢,都给你提供好了啊,如果数据库具有单这个连接状态的概念,那该状态呢,只有在事物中被观察时才可信什么,一旦调用这个它begin返回这个TX会绑定到这个单个连接里边,因为我们知道啊,可能之前你有开发经验的多少开事物的话需要用那个什么可耐。
05:05
调一个呃方法,然后开启事物对吧,那都是用connection调的,包括回滚呢,或者是提交都是用connection,那你得保证他们这些操作呢,用的是同一个链接,所以这块呢,他也帮你解决了啊,保证是这个单个链接,因为在一个事物里面,这个链接肯定得是同一个啊,还有科目或bag,诶这这块这个DB啊,这个DB,那我这个怎么样能这个比如获取链接呢?诶怎么样给这个DB,比如赋值的,它是一个操作数据库的一一个句柄啊,一个句柄,那怎么办呢?需要调circleq里边的一个open,哎,Open这个函数,Open这个函数啊,诶我们在这个一会写一个工具类,就是为了拿连接的,为了拿链接的,我们这个定义一个全局,比如这个全局变量,定一个DB circle点一个DB,然后来定义一个错误啊错误,然后通过这个调circle里边的open这个函数,诶你传一下你到底连什么数据库,哎,我连这个MYS库,那连MYSQL,那后边需要有一个地址啊,你连MYSQ里边哪一个数据库啊,所以呢,就有这样的一个地址,这个地址呢。
06:05
下边有啊这个规则啊,规则怎么来写,然后这个就给我们那个全局变量DB和哎I进行复值了,如果这个L哎不是空的,那我就盘pan了一下,然并并且呢,用error.error这个方法呢,这个方法就返回一个性的值啊,就打一下这个错误信息啊,显示一下这个错误信息,好下边是对这个O函数的一个说明,这些都是从官方文档里边摘过来的啊,摘过来的你包括这个。Open里面第一个drive class open打开一个drive name指定的一个数据库,我们这块指定的是。My circle就是连MYSQL的啊,连MYSQ的,然后这个data source name呢,指定这个数据源,数据源就是要你连的,其实就是这个数据,你要连哪个数据库啊,一般至少要包含数据库文件名和这个什么呢?可能的一个连接信息,我们这块是写的这个比较全的啊,其实你要是这个连的是本机的话,后边这个TCP括号,Log括号,冒号3306可以省略。明白啥意思吧,你要连本地的话啊,这个是可以省略的,为什么要把它写全呢?因为有可能比如这个有的,呃,电脑里边如果要不想装这个,没有这个MYSQ数据库假设啊,你想连你同桌的,那你就把这个local house是不是改成你同桌的这个IP地址就可以了,对吧,就是这个意思啊,就是这个比较完整的啊,比较完整的艾后边一个tcb local号23306,当然可以可以省略,直接at斜杠这个test也是可以的啊,也是可以的,然后下边这块就说了这个参数data source name了,就这个呃,数据库用户名冒号数据库密码,哎,我这个用的是root,那这块就是root后边的冒号数据库密码,我的也是root,所以呢写的是root,你呢不是root呢就不能叫root了,所以这边啊,你一会儿自己写的时候,哎。
07:42
不要什么跟我的一模一样,你得看一下你的密码跟我的一不一样对吧,诶不一样就不能这样写了,然后一个at特TCP,哎,TCP一个协议对吧,中括号啊,中括号这个DCP,然后括号呢,Look house a house这个呢,你看我这个加中括号是啥意思呢,是不是可选呢?哎,加中括号的意思,知道什么什么意思吧,就是可选的意思对吧?哎,可选的可以不写,哎可以不写,也可以写上,也可以写上,哎就是这个啊,中括号就可选的意思,你像我们这个上午看的这个九块的API,你点开它这里边啊,有好多这个带中号的那个,你们之前讲过aja是吧。
08:18
J讲了吗?哎,比如aja,哎这里边你看URL,哎中括号settings,这个settings设置可以没有,但是URL必须得有,你发请求嘛,发异步请求必须得有我这个请求地址,所以呢,我们用一个中括号的意思就是这个可选,你可以指定也可以不指定这块,这个中括号里边TCP卢啊卢,但是要注意这个open函数,你调完这个open本函数就不不是说他就拿到这个链接了,哎不是这个样子的啊,来看一下它的一个说明。Open函数的一个说明啊,这个open函数呢,可只是验证题参数,就是看一下你写的这个my circle啊,还有这个data source name啊,到底对不对,就是验证一下你写的这些对不对,哎,而不创建与数据库的链接,也就是你用的时候对数据库进行增删改啥用的时候,我才拿这个链接,因你可以认为它延迟我这个写完调完这个open方法之后,他不是直接就从池子里边把这个链接拿到了,哎,他是检查一下你写的这些配的这些属性,这些参数对不对,诶来验证其参数啊,并不是直接拿的啊,不创建数据库的链接,如果要检查数据库的数据源的名称是否合法,有你配的这个数据源连那个T子,这就是后边我写的这一串啊,合伙法呢,你需要什么呢?P一下啊。
09:29
已经调用返回值的一个PIN方法,哎,PIN方法就可以看一下啊,你这个,呃,里边写的这个这对不对了啊,对不对啦,而且下边也说了什么呢,可以给安全多个勾勾程序啊呃同时使用,而且这个维护支撑的一个闲置的连接值,所以这里边呢,呃勾呢都帮你这个做了连接值啊什么的东西啊都有了啊这样一来呢,欧函数只需要调用一次啊,这些很少需要关闭,这个DB就不用关啊,因为里边有连接池嘛,你不用关它啊,不用关它,这是这一块啊,这是一块,那下面呢,我们就来这个,我们先把这几个,哎把这个包先给你点开吧,我们看一下我们官方文档啊。
10:05
其实我那个就是从官方文档截过来的啊。官方文档中文。找哪个包啊?Circle对吧?呃,Circle driver呢,是定义了些规范,就是接口嘛,哎,接口你要是这个,呃,第三方的一个驱动必须得实现,我这里边的接口就这个意思,我定义了规范,诶规范你这个如果是连MYSQ,有MYSQ的一个驱动,哎,有它的一个实现,如果连Oracle有Oracle的一个实现,诶你这样这第三方呢,因为官方没有给你提供,你必须得去那个gihab里边去下载,诶它里边你搜一下啊,你搜完之后呢,它里边有连my circleq的驱动啊,连O的驱动啊,连什么其他的这个,呃,什么IBM啊等等啊,连S搜啊,各种数据库的驱动它都有,所以你连什么都下载什么,然后把它导进来就可以了,来导一下就可以了啊就是这块,好,我们来打开这个circle口包。来看一下这里边有这个DB,哎,DB你看这里边啊,有一个open方法,哎,我我就是从这截过去的啊DB什么输入库,操作区别等等啊啊下边就看什么打开一个数据库,然后呢,指定数据源一般包含什么数据库文件名和什么啊这块也说了,返回一个什么呢?呃,大多数用户会通过数据库特定的连接帮助函数打开数据库,返回一个,呃,DB这是不是一个指针呢?
11:21
对吧,还有够标准库中没有数据库驱动,诶参见它,哎就是让你获取第三方驱动的,哎,获取三方点下一个链接,或者你去get half上面下载也是可以的啊,在那里边搜也是可以的啊还有这块说了open函数呢,可能只是验证期参数,而不用创建这个链接,哎,下边我们这个已经看过了啊,就不再读了,不再读了,这是这个DB这个呃结构啊,这个结构。那下边这就是个PIN方法,包括close方法这些呢,我们现在也用不着啊,现在就不说了,那下面呢,我们就来把这个,比如这个,呃,连这个数据库的这一个工具呢,我们把它给创建出来来啊,我们写一个。
12:00
来在这呢,我们再来创建一个文件夹吧,我刚刚创建的时候创建到SR外边了啊,我在这里来创建一个文件夹,有一个web。哎,零一吧,还是下划线的DB。在这里边呢,我们来再创建一个子包,比如再创建一个子文件夹,比如新建一个文件夹,我整一个什么us。我们在这里边来创建一个文件,新建一个文件叫一个什么呢?DB.go。好,来倒一下,写一个报名。要一个,比如这叫UU好在这里边呢,我们来定义两个全局变量。一个是啥?一个是啥DB,然后这个是指针棒新点一个。Circle点一个DB对吧,Circle点一个DB,然后第二个呢,我们整一个error ER ER类型,Error类型好看,自动把这个包给我们导进来啊,给我导进来啊,这块这个报了一个,它这是啥意思呢。
13:04
哎,没有用是吧,所以他这块啊这个哎只要不是那个红线呢,其实呢,是不是哎都没关系对吧?哎都没关系,他说你这个呢,这个变量什么没有这个command慢呢,没有注释,也没有被被被导出,对吧,也就没其他地方没有用对吧,就是这个意思啊就是这个意思,好那有了它之后呢,下面呢,我们来写一个什么呢?In it的一个函数,就是为了什么呢?初始化它的就是来给这个全局的DB赋值的啊赋值的好,那在这呢,我需要这个。来来,直接写了啊,DB。逗号一。等于哎,点一个什么呀。是不是open方法呀,诶open方法啊,调这个open方法,哎,然后呢,里边诶需要传一下你要连的这个数据库,诶比如我要连MYSQL,哎MYSQ好逗号后边就是那个JA什么的,就是那个数据源了,数据源了好这个格式是什么呢?是你的用户名。
14:01
诶,我的用户名是啥root,然后冒号后边是你的密码,我的密码还是,诶怎么跑那了。我的密码还是root,你那要不是的话,哎,就不能写root了啊,就不能写root了,哎就就就是我们刚刚说的这个在哪呢?这个中括里边这个可以不写。呃,中括号里边这个可以不写的,前面的啊必须得写啊,必须得写数据库的用户名,数据冒号,数据库的密码,然后一个艾服,你可以直接写杠数据库名,哎,如果你要连住连你同桌的,你就要把中间这个加上TCP括号,然后把你同桌的IP,比如幺九二点什么什么,然后冒号它的端口号,它端号,那我们写完整么啊写完整么来继续写,哎,这里边root,然后第二个是一个我的是root,哎,注意啊,是我的root at符。At符,哎,然后后面该写啥了,是不是可以直接斜杠test了。诶,可以吧。因为我现在是不是要连我本机的呀,哎,连我本机的这个你可以省略啊,是可以省略的,如果不是我本机的呢。
15:07
是不是得加一个TCP括号里边,比如你要连这个我的IP是什么呀。1.10是吧,你比如它的IP建设是一点几,你比如幺九二点幺零八点什么什么啊,那我把这个写全也行,比如local。Host冒号3306。这是完整的啊,完整的,哎完整的啊,写个test,其实后边这个呢,哎可以不写啊,可以不写好,哎这是这个,这是这个,哎说这两个还没有用,那下边呢,我们来。EE,如果不等于就是不为空有错误的话,那这块我们就拍你可一下吧。然后在这里边呢,我们error点一个error,调一下error方法,哎,我们来打一下这个异常信息啊,打一下这个异常信息,这个error.error这个方法啊,你们之前用过吗。用过是吧,用国啊,这个在这个在哪个包下呀。
16:06
艾在艾包厢吗?在这个build in吧。就是嘛。不是挨上吗?不是艾吗?还有一个。As。好了啊,哎,我不找了啊,你这个哎啊在这在这是吧,你们说是这个LLS里边都有啥。New是吧,哎哟牛啊好啊,那现在我是不是数据库驱动还没有导啊。没吧?数据库驱动是不是还没导了,哎,所以呢,这块啊,我们把那个数据库驱动给导进来,哎,来加个括号画下行啊画下行还没有导数据库驱动呢。
17:07
哎,小括号好,那那个数据库驱动,那个数据库驱动我在这是不是不想用它里边的内容,只是导一下,所以呢,该怎么办啊。是不是写一个下划线呢。诶对吧,这这能看懂吗?然后呢,是这个。In。哎,我库里边啊,诶点一个com,然后呢。斜杠。这个够。诶,我那个叫什么circle杠。哎,是这个吗?哎,Go杠哎go杠哎circle,哎gun driver这个驱动啊,这个驱动呢,一会儿一会发给你啊,就是go-circle gun driver,我这个呢,哎文档里边在这一块我我有啊,一会发给你,在我们这个go里边,Go web里边在这给你准备好了啊go circle gun driver1会把这个发给你就不用下载了,好就这个啊,你看他这个的意思是这个这个东西这个下划线这个啊只能在什么闷包里边来用,在这不让我用啊,不让我用。
18:14
好啊,这个呢,写完了,写完之后呢,这块。啊对,多了一个冒号,诶我上面已经有了,在这直接给它赋值对吧,给它制啊好了啊,这是这个我们这个工具类YouTubes诶连数据库用的,诶我们把这个配完了,诶用的这个这个驱动啊,这个驱动这块,尤其是后边这个诶这个值诶要注意这个一定得写对了,因为我这个数据库里边有test,我们来看一下啊,点开它。连接我这默认不是买circle库里边有个test数据库嘛,哎,就是这个里边现在还没有任何表,我们一会儿呢,哎,为了测试哎来创建这个对应的表啊,来创建对应表,好,那这个写完之后呢,我们继续来往下看。下边就是增删改查这个操作了,那现在我要实现这个增删改查呢,我需要有一个库,有一个表,所以呢,我需要来创建一下这个表啊,创建一下这个表,要创建表的话,这样吧,我自己写吧,知道你还还还还记不记得这个命令啊。
19:13
来用命令创建一张表的命令是什么呀?Table,比如叫一个users。可以吧?啊,第一个呢,ID类型primary。K two。Increment自增对吧,第二个比如username。刘世明。我我操整个100可以吧。一百二五五都行啊,然后呢,整一个比如闹闹。然后呢,或者我整一个唯unique。不能重复可以吧,这些都知道什么意思吧?好,再来一个,比如password。我差也是我叉100关键字,我这样运行它会不会有问题啊。
20:06
测过没,之前?Email,我100好email就可以为闹了,哎,万一他没有邮箱呢?那就这样啊。好,下面呢,来执行一下。当然啊,你自己写一个其他表也可以啊,我们就为了测试一下,好来现在呢,也来执行一下,看看有没有问题,哎,好成功了啊,这是F5。点开好user,诶邮件打开表好没问题啊,有这样的一个表,那那现在呢,我们要对这个表进行增删改查的操作,我们比如先测试什么呢?先测试这个添加,因为现在里边还没有数据,还没有数据,所以呢,我们要测试这个诶添加的操作啊添加操作。那要测试添加操作呢,我需要有一个有一个结构,哎结构要跟这个表要对应嘛,所以呢,我还得需要创建一个哎结构,哎比如创建一个U的啊,创建UR下边这块就是像这个U的表示插插入一条记录了,创建了一个U的一个structure啊一个结构体,一个结构体,所以呢,哎,那我们这块呢,哎还得这样。
21:11
来我们先把这个结构创建好啊,那在这我就这样了,哎,来在这呢。右键我们来新建一个文件夹吧,就叫一个model。在里边呢,来新建一个文件叫UR。悠着点一个洞。好在这呢,拍。Model,好,他给你model tap。好,那现在呢,我这一个结构里边的这个字段,是不是要跟这个数据库里边这个要对应啊,对吧,所以呢,第一个ID。ID什么类型的?哎,In特特好,第二个。
22:00
Username string。第三个passor spring。第四个email string好,哎就这整这几个ID,哎好有他,哎有了这个结构了,还有他这块画了红线啊,还是这个意思,说什么没有注注释,哎或者说什么呢,没有被这个导出啊,没有被导出,那你可以写个注释啊,你写注释他就没这个没这个问题了,就写个注释什么的,就是user结构题。但是你写完之后注意啊,他这个注释还有个要求,有啥要求呢。你还得这个,你还得这样,它才没有那个红,那个红色的虚线,也就是说后边我们写方法写这个函数都是这样,你如果有强迫症啊,不想看到那个红线,你就必须得按他这个来,哎,你看啊,我如果这样写,它给你的提示是啥呢?你看。
23:02
Should be什么呢?User,然后空格点点点,也就user空一下格,后面再写注释。所以啊,这些要求都比较烦人是吧,也比较烦人,所以呢,你这样呢就没问题了,这样就没问题了,你包括下边写方法啊,写这个函数都是这样,都是这样啊,这个其实它也不影响我们运行啊,不影响运行,就是你看着可能如果有强迫症,看着可能不爽是吧?好,那有了它下面呢,我们来我们就写方法了啊,不写函数了,直接写方法了干什么呢?诶这个向数据库中,比如添加用户添加user的的这个方法,我们来写一个,来写一个,那这块我这个叫ADD user,为了不让他有那个啊,有那个提示,哎,来。括号。里面有的星有的,这能看懂吗。ABU的好添加,那这块呢,我整一个error吧。好ER or好,这个返回值啊,返回一个error,返回一个error,好那这个现在呢,我要实现是不是调这个方法项目数据库里边插入数据了呀,对吧?哎,所以呢,那在这里边我得需要写啥呀,首先SQL语句得有吧。
24:18
诶对吧,所以呢,来第一步呢,我需要写SQL语句。比如circle string等于好插入的circle语句,这块就涉及到你们之前讲的MYSQL里边的内容了啊。Insert。Users ID是不是自增的,不用指定吗?Username逗号。Passor逗号email,然后Y柳丝括号。问号逗号问号。逗号问号,哎,对吧,哎,这是这个词口语好,那下面该怎么办呢。
25:00
诶,注意下面就该借助于我们这个U,是不是该借借助于这个DB对数据库进行操作了呀,对吧?哎,这个借助于这个DB进行操作了,好,那下面啊,我们就会去官方文档来看一下关于DB它下边的一个方法,当然了我们word上面也有啊,我要通过word看,还得往下翻,我们直接去文档了啊。来找到我们的折扣,来找DB。好点开它,哎来看,嗯,DB这个结构往下翻。啊翻诶来看这块有query,你看这个名字你就知道干啥的。查询的吧,还有什么宽肉。查询行对吧,诶来看这个呢。这是不是执行的那个。前几个那个单词的前几个字母啊,对吧,你来看这个啊,这个呢,里边传一个宽的一个。这是啥呀,这不传一个那个对那个查询的语句嘛,对吧?哎查询的语句啊查询的语句,然后呢,后边就传参数了啊传参数接口嘛,哎查什么参数都可以啊什么呢,执行一次命令,包括查询,删除,更新,插入等,诶对吧,哎等然后呢,不返回任何执行结果,也就是哎不返回任何执行结果,这个呢,参数二表示呢,宽容的暂回,暂回参数是不是就那个暂回符。
26:24
你执行的时候,我那是不是有问号问号问号对吧,所以呢,这个A,哎这个A啊啊哎这个呢,哎就是那个参数,哎有填充占位符的时候,还有下边这个query。执行一次查询返回多行结果。一般执行select命令,那我现在用它吗?我现在是不是执行插入的对吧,所以呢这块啊,我们这个把这个增删改查说完之后呢,你会发现其实方法也不多,如果是增删改调这个方法,如果是查询一行调这个方法查询所有的。
27:02
调这个query方法,诶来,我们把这个也看完query肉。执行一次查询,也是执行查询并期望返回最多一行结果,什么意思?即使你有好多结果,我最终是不是也只返回一行?啊,总会返回什么非嗯非空的这个值啊,直到返回的值什么呢?干方法被调用时,干是干是干啥的呢?有他给你返回了一个结果,就是查到了一条记录,那这条记录里边那个值我是不是得得到啊,怎么得到呢?就是用这个扫描这个方法。这个方法你看注意啊,它是这个。是不是这个肉这个类型的方法呀。诶对吧,所以这块你来看,诶这个当你掉这个query肉的时候,你来看最后的它query也好,Query肉也好,是不是最终返回了一个Rose或者是肉类型啊,诶你点开它。用这个文档不好的地方就是我点不开是吧?啊开了,哎,来看你看这个肉里边是不是有SC,谁看SC是干啥的呢?你看因为你这个执行完调完query或query肉之后,调query返回的是Rose,调query是不是返回的Rose,哎,这个结构,那这里边呢,有个思想看将该行查询结果各列分别保存到诶你传的这个里边指定的值中,如果哎,该查询匹配多行,SC会使用第一行结果,并丢弃趋于各行,也就是说哎,如果你要调这个。
28:33
宽肉得到了一个,最终呢,返回的这个类型是一个肉的一个指针,那我下面再调SC是不是只能扫描第一行。哎,对吧,即使有多行,我是不是也只得到第一行里边的值?对吧,就是这个啊,就是这个就是这个,那那么这个Rose呢。诶来往上翻,你调query这个方法的时候,最终它返回的是一个Rose,还有一个error,还有error,我们点开一个Rose Rose里边是不是也有一个scan。
29:04
诶对吧,诶也有一个扫描的啊,也有扫描的,另外呢,它还有一个方法叫next next干什么呢?准备用于SC方法的下一行结果,因为呢,我这个que的时候,它要查询多行,那将来我这里边是不是有好多列这条记录,这条记录,这条记录这条记录对吧?那我这时候呢,Rose呢,我要调一下next,就跟有一个游标似的,这块有个游标,诶比如调一下next指向第一行了,第一行的数据我拿完之后是不是在next指向第二行。呃,第二行的数据我也拿到了,呃,在那个第三行,第三行的数据我也拿到了,所以啊,这这块啊,这这块,诶当我们调用这个肉,调用这个query的时候,诶是查多行,诶返回的是Rose,那Rose呢,你需要调这个next,调next next返回一个不尔性的值,也就是说我写一个for循环,在for循环里边呢,用那个rose.next然后呢,让它一行行的来进行扫,诶把它每行的数据都得到,都得到这这块啊这这块这块。
30:01
然后呢,我们来继续。往上看啊,往上看。在这个DB里边呢,还有一个方法叫这个prepare prepare是干啥的呢。你们这个讲讲这个买的时候对。还有这个是不是预编译啊,预处理吧,诶预处理你看这个啊,一会呢,我给大家写两个版本啊,写两个版本,一个是带预处理的,一个是直接就不不带这个预处理的啊看这个DB里边这个prepare哎,你可以说什么预宾prepare里边是不是直接传一个string的一个SQL语句,对吧?来传一个,它传完了之后啊,创建一个准备好的状态,用于之后的查询和命令返回值,可以同时执行多个查询和命令,诶来看这块,这块它返回的类型是STMT对吧?哎,点开它。点开它,你看STMD里边呢,它也有这些方法,Queryry肉,你看这个时候它这个里边是不是只传一个参数了,不是啊,只传一种了。
31:09
那这个呢。这个里边就是直接传的,就是你要填充的那些站文符,哎,直接传送的单符,也就是说如果你要调play,呃,这个prepare,哎跟调那个直接调it啊,诶这个。传的这个参数呢,哎,不一样,哎传的参数不一样,你可以先预编译,先预编译之后呢,直接再调这个执行,把那个填充账数给他传填充进去,或者你干脆一步到位,直接调这个SQ的,把S扣传进去,然后填这上口两种都可以都可以好,那下面啊,我们就来测试一下。来写完这个SQL语句。九子。下边是不是我们来预编译可以吧?第一步来把这个步骤给你写一下啊,第一步写搜口语句,第二步呢,诶,比如我来预编译。就是预处理,或者说那预编译,我是不是要用那个DB里边那个prepare方法了。
32:05
哎,对吧,哎来STMT,我这写一个insert啊in什么STMT,然后呢,这块它有没有返回error来看一下。在哪儿呢?哎,普有error吧,哎两个啊两个,所以呢,这块,哎逗号E22等于等于什么呢?我是不是要用U里边这个DB了,对吧,Us点一个DB点一个prepare。没有提示了,怎么?是这样吗?好哎,我CTRLCTRL保存一下,把这个包导进来啊,包导进来,哎包导进来之后呢,它就有提示了啊,它提示了,来来看一下啊pair点一个pre,哎,Pair,哎包导进来它就有提示了,不过你自己写出来之后,你抗T住LS下它也能自动帮你导啊,自动帮你倒好,这里边我们刚刚看过了,是不是就传一个查询字符串,就是我们的circleq语句,所以呢,诶来circle s tr s tr好。
33:21
那写完它之后呢?下面我们来判断了IF122不等于刀。不等于空,那这块呢,我就可以干什么呢,我来打印一下吧。哎,普太烂了啊,我写一个什么呢,预变音。我就写汉字了啊,预编译出现异常,就这样写了,预编译出现异常好。然后呢,我这块整一个。122122好。这块写个分号吧。好,就这样了啊,就这样了,好下面注意了,得到这个STM,就是我们这个返回值之后,这个里边是不是有那个执行,还有查询的操作。
34:07
对吧,你看STM得到这个类型之后呢,下边是不是有执行,还有查询,还有查有银行,所以呢,下面是不是该执行了。诶对吧,哎,该执行了啊,该执行了,但是注意啊,该执行,我们执行的时候是插入的时候,是不是不需要要这个result了呀。这个result还需要吗?哎,不需要了吧,因为我就插入也不需要让你给我返回什么结果吧,对吧,所以呢,我就不需要啊,就不需要了,所以呢,哎,我那个值呢,就不要了啊就不要了,好下面再写一步第三步。第三步,执行。哎,直行,那直行这个时候呢,哎,用用这个U点一个DB点一个。是用这个吗?哎,不是,是不是该用in statement点一个excu了,对吧?哎执行的时候这里边是不是得填充那个占位符了,就上面那个三个问号对吧?哎三个问号,哎三个问号好哎现在呢,我们来第一个,比如呢,我就要插入一个我的命,诶第一个用户名,然后第二个呢是密码逗号,诶来一个什么呢?123456好第三个逗号。
35:17
来个邮箱min at at硅谷第一个com,好,那这个呢,我们刚刚看到了,哎,它这个会返回一个error,还有一个result,我们result不要了,所以呢,一二哎二吧。等于好,哎,得到一个它,哎,得到一个它好,那下面呢,我们再来写一个if。还有啊,我这块呢,诶打印它之外呢,我还return一下啊return一下一二,哎这个往return了,那上面我不是返回一个错误嘛,对吧?啊这块呢,同样,诶这个怎么写括号了呢。1222。哎,如果不等于。因为你写其他的写习惯的时候就是容易写是吧,哎,你这个写习惯了,其他的就就老是不写,哎正常啊正常,然后这块呢,我们同样啊,把这个呢,直接复制一下了,不写了,CTRLC我们写什么呢,执行。
36:09
或者什么的填充占位符等等啊都可以,诶没有复制过来CTRLC拿过来,或者说执行出现异常。哎到底就看一下预编一出错了,还是执行时候出错了,哎这个是二,哎好这是这个好,那这个执行完之后,哎,我们这个的不要吗?哎不要,所以呢,最后呢,Return上一个new,哎一个到哎没有问题了,没有问题了,好啊这是这个添加user,哎添加user的这个方法我们写完了,那写完之后该干啥了呢。我是不是得看这个方法对不对,能不能向数据库里边插入数据啊,对,该测试了,该测试了,这是这一个啊,这是这一个,那这样我们这是第一个版本添加用户的,我们再来写一个版本二。方法一。
37:01
这是方法一,我们再来写一个,那来写一个,我就把这个复制一下,然后稍微改一下。我们来写一个不带prepare的方法二。方法二呢,这个方法我改一下我的命。ADD user2,哎,里边传的内容都一样啊,传的内容都一样。好,这块又咋了?前面那个。哎,好啊好,加个二就行了,好现在呢,我们这个跟那个不一样,哎把这个步骤呢,给它缩减一下,诶怎么缩减呢?你来看我们这个刚刚这块是不是先预编译的,用DB掉了一个pre片这个方法对吧,那我们刚刚看DB的时候往上翻是不是DB直接有一个。XQ的就是直行的一个方法,是不是直接把S口一跟占位符传进来就可了,那这个时候是不是就少了一步。哎,对吧,哎,所以这块啊,你也可以这样写,也就是不用这个了,哎不用这个了,哎来,那我们把第一步都是一样的写S语句。
38:09
CTRLC,我把这个粘过来了啊,CTRLC。哎,这个有啊,不用粘,然后呢,把这个删掉。把这三条之后,下边那是直接直行。来。直接直行下划线,Result不要ER等于什么呢?us.db点是不是有?是不是有这个方法对吧?哎,这个方法里边你来看是不是传一个四扣语句,传一个占位符对吧?诶所以这块啊,你选择哪种方式都可以,那这个是不是就少写一步啊对吧?诶少写一步啊好来传一个什么呢?Circle str,然后下面呢,直接就是占位符了,我们来一个IN2一会呢两个一块测看看有没有问题。逗号第二个,我的命。
39:02
密码是吧,那个666666。逗号。来ME2AT一个C哪点com好,这是第二种添加到,哎这块呢,就直接是第二步是执行了,哎执行了,然后这块呢,有一个挨着挨着诶如果它不等于呢,诶我们来说什么呢?执行出现异常,Return保存好,这是写的,诶第二种方式向数据库里边添加数据。好,那写完之后呢,我们需要测试,看看这个方法写的对不对,怎么来测呢?哎,所以呢,下面我们来看了啊,这个测试呢,它要求你那个测试文件必须。干什么呢?那个方法必须test开头,而且里边的参数呢也有要求,我们先来看一下啊,先来看一下啊,先看我们这个文档单元测试。顾名思义,单元测试呢,就是一种验证单元的正确而设行的自动化这个测试也就是让你写一点我测一下看有没有问题,写一点测试一下有没有问题,其实我们真正项目上线的时候,单元测试这个模块是不是就没用了呀,对吧?哎,就没用了啊,因为。
40:10
专门有测试人员对吧?有测试人员给你来测啊,你来测测试你写的代码有没有问题,一个单元就是程序中的一个模块,哎,模块化部分,一般来说一个单元通常会与程序中的一个函数或一个方法相对应,我们现在写了两个两个两个方法了,所以呢,我们需要测一下的啊,但是这不并不是必须的啊,构造单元测试需要用到这个testing包,又用到了一个包。Testing,哎,Testing啊,用一下它以及go test命令,就是你要测试的话,输一个go test哎命令,哎,Go test命令,而且呢,对测试文件也有以下要求,注意测试文件不能乱写,哎不能乱写,怎么写呢?被测试的原文件和测试文件必须位于同一个包下,也就说白了,我是测试文件是不是跟他在同一个文件夹下呀,哎,必须得在同一个文件下呀,因为你写命令的时候只写一个go test,没有什么什么go test哪个哪个文件,哎,他直接就找那个以test test的那个作为这个结尾的那个文件了啊,而且测试文件必须要以下环键test点构结尾。
41:10
如果现在要测U的里边的方法,就是U的下划线test.go必须得这样命名,否则它没法测试好,这是这块啊。还有下边,虽然go对测试文件太下划线,太多的勾的前缀没有强制要求,不过一般我们都设置为被测试文件的文件名,什么意思呢?比如接下来我是不是要对user里边的方法进行测试?正常来说,我起名就是有的下划线test.go不过呢,也可以起成其他的,比如什么含下划线test.go什么,其他的都可以,哎,这个理解吧,也就说没有够,没有强制要求,你必须得是这个测试文件的那个文件名作为前缀,明白吧,你可以写个UU的下划线go。呃,U的下划线,Test的点部或者什么呢?呃,什么其他的什么DB下划线都可以,但是通常我们就以这个被测试的文件的文件名作为前缀,就是通常情况下不是说是必须的啊,没有强制要求诶,那么测试文件通常我们设置为什么优的下线探测表构,这是个通常这是对文件的一个要求,那么他对这个测试文件中的测试函数也有要求来看。
42:16
你的测试函数必须得是test叉叉叉。而且叉叉叉,第一个叉还必须得大写。哎,就是这个啊,一会我们看官方文档,官方文档上面也是这样说的,其中叉叉叉的首字母是大写的英文字母,这个叉叉叉无所谓,你叫什么都行,但是必须得是第一个字母,必须得是大写的英文字母。哎,函数这个参数,哎,就是里边这个参数的一个,这个标签就是参数里边这个参数。哎,必须得是什么呢,哎,这个。星testing.t这个这样的一个指针类型啊指针类型,哎还有一个就是benchmark,如果是benchmark的呢,就是就是这个testing.b了,哎,它是点B这个类型了,因为我们现在是这个测试,哎简单的一个测试,所以它里边传T,哎testing新test.t哎通过哎。
43:07
这个传这种参数啊,来进行测试啊,就是这个两个要求,对测试文件的要求,以及对里边测试函数的一个要求,下边这块就是测试代码了,我们也可以看一下啊,在这个里边写这个测试代码,比如test as user。哎,后边这个单词呢,随便写,但是第一个必须得是大写的英文字母啊英文字母,然后呢,创建一个U的,然后下边就可以来来往里边来往里边进行添加了啊,往里边进行添加了,刚刚我们是写死了是吧,写死了啊写死了你也可以这个测试时来写那个user啊,写那个user也是可以的啊,也是可以的,好,下面这块就是截的我们这个官方文档里边的一个截的一个图了啊啊,我们也就看一下吧,Testing包。找到,哎,把它关掉,我们今天说了三块包,一个是net http,一个是。Database circle,还有一个testing,还有个testing来找到我们的testing。在哪儿呢?
44:01
T点开。好,哎,这块也说了啊,Test提供对go包的一个自动化测试的一个支持,通过go test的命令能够自动执行如下形式的这个任何函数,呃,注意了,还是执行如下形式的,你必须得是这个形式,Testing什么什么什么,这块也说了,叉叉叉可以是任何字母,数字,字符串,但是第一个字母不能是小写的。A到Z字母就得A到Z吗?哎,必须得是大写的啊,必须得是大写的,然下边呢,也给你举了一个简单的例子啊,简单例子下面是这个班mark啊,它它的一个测试传的是test b,哎,Test be,好,那下面呢,我们就来测试一下这个方法啊。我们在这个方法里边啊,这块是写死的啊,写死的我们也可以自己,哎来指定,哎来一个获取,怎么获取呢?因为这是user的方法,对吧,我可以干啥user点一个username,诶对吧?诶可不可以。可以吧,当然我这块写死的,你在创建那个U的时候,是不是就可以空了。
45:04
这这这能明白吧,这没有什么啊,这没有什么,你这块可以可以这样啊,可以这样,比如这个我我我我我不写词,不写词就是这样,那写死吧,就这样吧啊。不写死,我这两个方法是不是差不多,用户不一样了,也不一样,我一会测试的时候用那个U的就可以是空的了啊,就可以是空的了,就创建那个U的结构体就可以是实例就可以是空的了,里边就不需要有这些属性了,它自动就能插入了,如果要我要是用通过U的来获取,我创建一个U的调这两个方法的时候,它传的都一样了啊,插入的都一样了,我现在写的写死它就不一样了。好,下面呢我们就来测试一下,首先文件名来右键。新建文件U的前面这个U的前缀可以任意写对吧,但是后边的不能下划线。对test点勾,哎,Test点勾所以啊,哎,这个前面的U的前面可以任意写,但是test_test必须得这个自己写啊,自己写好拍开。
46:07
诶,这个是model。嗯。好,哎,那下面呢,我们要写这个testing啊,写这个测试了。来写一个test,哎,这一个啊大写,哎大写test什么呢?And user后边这个呢,单词第一个必须得是大写的英文字母,哎,里边传的参数T星。Test。点T,哎,testing.t哎,就这样好,哎,自动的导这个testing包在这里边,我们来进行测试。诶,我要测这个添加,我先打印一句话啊fmt第一个print来。好,哎,我什么呢?诶测试添加用户,好诶写这样的一句话,哎,测试添加用户,那下面呢,我们需要调那个方法了,调那个方法我是不是得有这个user啊,所以来user。
47:02
等于and。Model点一个user好,哎保存哎把model也导进来,哎导进来我这块这个user是空的,没有影响吧,因为我这个来看啊。我的我的这个我的那个U呢,我这里边这是不是写写死的呀。对吧,我调这个方法之后,是不是自动就把这些给它插入进去了,对吧?诶插入进去了啊好,诶来继续。啊,这一块啊,这块我不用我不用这个倒了,不用对同一个包下对吧?哎,对直接写啊直接写嗯,直接写U的啊不用写model用在同一个包下,同一个包下啊好有了这个U的下面呢,哎,我们来测试呃调用。调用什么呢?添加这个用户的这个方法好来诶user点一个。
48:05
ADDU,哎,ADDU好,那这个错误,哎错误呢,我在这就不要了啊,就不要了,哎,就不要了,然后呢,我们再来测一下,哎,ADD u to ADD to,看看两种方式能不能向数据库里边来插入这个数据,插数据好啊,我们这个一口气写了这个。DB工具类DB.go然后呢,又在user里边写了两个添加用户的方法,好,下面呢我们就来测试一下,看看有没有问题,怎么来测试呢?你在摸索这块,右键在终端打开。然后输一个什么命令啊。哎,敲回车。360,哎,坏了。哎,我把360退了啊。
49:00
哎,你这个360啊。完了是吧,哎,执行完了啊,执行完了报错了没。诶,报错了,那这个360的事啊,我们再来一次啊,再来一次,哎,再来一次,我把这个关了重新来啊,这个360有时候很恶心是吧。勾你们讲Java不是讲这个勾基础的时候,应该也遇到过这个问题吧。对吧,哎,360啊很恶心。Go。诶,测试添加用户好没问题,Pass OK OK了啊OK了,好,现在呢,我们去数据库里边看一下。刷新是不是多了两个用户对吧?哎,证明我们写的那两个方法呢,没有问题,没有问题啊,所以呢,这块你就根据你自己,比如你这个根据你自己的一个喜好啊,也是个人的一个习惯了,哎,你这个看你是喜欢用这个先预变译的,这个时候调方法是不一样,你要是预编译调的是DB里边这个prepare,然后调这个执行的时候,调的就不是DB里边的执行了,对吧,是这个啊呃,STMD这个结构里边的一个方法啊,它里边的一个方法,如果你直接诶。
50:19
写完思考去直接执行,是不是掉的是DB里边这个执行对吧?哎,这是这两个方法啊,两个方法好了啊,下课休息一下。
我来说两句