应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

golang源码分析gomysql(3)mysql客户端

  mysqlClient进行一次查询需要三个核心操作,获得连接、测试连是否可用、发送请求:conn,:client。Connect(127。0。0。1:3306,root,,test)conn。Ping()r,:conn。Execute(insertintotable(id,name)values(1,abc))
  首先我们看下获取连接的过程:github。comgomysqlorggomysqlv1。7。0clientconn。gofuncConnect(addrstring,userstring,passwordstring,dbNamestring,options。。。func(Conn))(Conn,error){dialer:net。Dialer{}returnConnectWithDialer(ctx,,addr,user,password,dbName,dialer。DialContext,options。。。)funcConnectWithDialer(ctxcontext。Context,networkstring,addrstring,userstring,passwordstring,dbNamestring,dialerDialer,options。。。func(Conn))(Conn,error){c:new(Conn)conn,err:dialer(ctx,network,addr)iferrc。handshake();err!nil{
  握手过程中需要进行身份认证:func(cConn)handshake()error{iferrc。readInitialHandshake();err!nil{iferr:c。writeAuthHandshake();err!nil{iferr:c。handleAuthResult();err!nil{
  标识连接的过程如下:typeConnstruct{packet。ConnuserstringpasswordstringdbstringtlsConfigtls。Configprotostringservercapabilitiescapabilityuint32clientsetcapabilitiesonlyccapsuint32attributesmap〔string〕stringstatusuint16charsetstringsalt〔〕byteauthPluginNamestringconnectionIDuint32}
  认证完成后就可以获得server端分配的本次连接的连接ID:github。comgomysqlorggomysqlv1。7。0clientauth。gofunc(cConn)readInitialHandshake()error{data,err:c。ReadPacket()returnerrors。Annotate(c。handleErrorPacket(data),readinitialhandshakeerror)c。connectionIDbinary。LittleEndian。Uint32(data〔pos:pos4〕)pos4
  一般通过conn。Ping()命令测试连接的可用性func(cConn)Ping()error{iferr:c。writeCommand(COMPING);err!nil{if,err:c。readOK();err!nil{
  可以看到它是一个单独的命令,mysql的命令列表如下:const(COMSLEEPbyteiotaCOMQUITCOMINITDBCOMQUERYCOMFIELDLISTCOMCREATEDBCOMDROPDBCOMREFRESHCOMSHUTDOWNCOMSTATISTICSCOMPROCESSINFOCOMCONNECTCOMPROCESSKILLCOMDEBUGCOMPINGCOMTIMECOMDELAYEDINSERTCOMCHANGEUSERCOMBINLOGDUMPCOMTABLEDUMPCOMCONNECTOUTCOMREGISTERSLAVECOMSTMTPREPARECOMSTMTEXECUTECOMSTMTSENDLONGDATACOMSTMTCLOSECOMSTMTRESETCOMSETOPTIONCOMSTMTFETCHCOMDAEMONCOMBINLOGDUMPGTIDCOMRESETCONNECTION)
  执行请求的场景可以分为两种:不带参数的请求和带参数的请求:github。comgomysqlorggomysqlv1。7。0clientconn。go,不带参数的请求直接执行,带参数的需要先预编译,然后执行。func(cConn)Execute(commandstring,args。。。interface{})(Result,error){iflen(args)0{returnc。exec(command)ifs,err:c。Prepare(command);err!nil{r,errs。Execute(args。。。)
  执行的过程就是向server发送COMQUERY命令func(cConn)exec(querystring)(Result,error){iferr:c。writeCommandStr(COMQUERY,query);err!nil{returnc。readResult(false)
  github。comgomysqlorggomysqlv1。7。0clientreq。gofunc(cConn)writeCommandStr(commandbyte,argstring)error{returnc。writeCommandBuf(command,utils。StringToByteSlice(arg))}func(cConn)writeCommandBuf(commandbyte,arg〔〕byte)error{err:c。WritePacket(data。B)
  github。comgomysqlorggomysqlv1。7。0packetconn。gofunc(cConn)WritePacket(data〔〕byte)error{
  预编译的请求发送在github。comgomysqlorggomysqlv1。7。0clientstmt。go,对应命令:COMSTMTPREPAREfunc(cConn)Prepare(querystring)(Stmt,error){iferr:c。writeCommandStr(COMSTMTPREPARE,query);err!nil{data,err:c。ReadPacket()s:new(Stmt)func(cConn)writeCommandStr(commandbyte,argstring)error{returnc。writeCommandBuf(command,utils。StringToByteSlice(arg))func(sStmt)Execute(args。。。interface{})(Result,error){iferr:s。write(args。。。);err!nil{returns。conn。readResult(true)
  发送命令的过程如下,它先填充字段类型信息,然后填充字段的值,然后进行发送:func(sStmt)write(args。。。interface{})error{fori:rangeargs{switchv:args〔i〕。(type){caseint8:paramTypes〔i1〕MYSQLTYPETINYparamValues〔i〕〔〕byte{byte(v)}s。conn。ResetSequence()returns。conn。WritePacket(data)}
  每次发生之前都会重置序列号。func(cConn)ResetSequence(){c。Sequence0}
  mysql的类型信息定义如下:const(MYSQLTYPEDECIMALbyteiotaMYSQLTYPETINYMYSQLTYPESHORTMYSQLTYPELONGMYSQLTYPEFLOATMYSQLTYPEDOUBLEMYSQLTYPENULLMYSQLTYPETIMESTAMPMYSQLTYPELONGLONGMYSQLTYPEINT24MYSQLTYPEDATEMYSQLTYPETIMEMYSQLTYPEDATETIMEMYSQLTYPEYEARMYSQLTYPENEWDATEMYSQLTYPEVARCHARMYSQLTYPEBITmysql5。6MYSQLTYPETIMESTAMP2MYSQLTYPEDATETIME2MYSQLTYPETIME2)const(MYSQLTYPEJSONbyteiota0xf5MYSQLTYPENEWDECIMALMYSQLTYPEENUMMYSQLTYPESETMYSQLTYPETINYBLOBMYSQLTYPEMEDIUMBLOBMYSQLTYPELONGBLOBMYSQLTYPEBLOBMYSQLTYPEVARSTRINGMYSQLTYPESTRINGMYSQLTYPEGEOMETRY)
  总结一下,mysqlclient的实现起来很简单,建立连接,按照mysql协议编码,发送请求到服务端。

保险股涨势行情受关注人身险改革成效初显财险持续改善1月13日,根据同花顺iFinD,今年初至今,A股保险板块上涨近6;港股保险板块强力反弹,20个交易日涨幅约11。近两个月,保险股估值迎来持续性修复,涨幅明显。2023年……又有牛奶被检出不合格!给孩子选牛奶,这个东西一定要看近日,广州市市场监督管理局发布公告,在抽检中发现广东温氏乳业股份有限公司生产的温氏牧场鲜牛奶检出菌落总数不合格。这里需要特别说明一下,通报中所说的菌落总数是指示性微生物指……港股收评恒指跌0。24恒生科技指数跌1。01耀才证券涨近122月14日港股震荡收跌,截至收盘,港股恒生指数跌0。24,报21113。76点,恒生科技指数跌1。01,报4330。6点,国企指数跌0。48,报7110。42点,红筹指数涨0。……百度APP生活节带您古城过大年,欢乐闹元宵!正月的古城年味浓,小长假已经结束但古城内热度依然不减,暴增的客流量让古城文化持续升温,逛庙会、赏花灯、听戏曲、观民俗。借此佳节,百度APP生活节联合即墨古城推出古城过大年、欢乐……怀孕不能吃螃蟹?妇产科医生孕妇真正不能吃的食物是这3种!女性怀孕后须做好饮食方面的调理,多吃富含维生素、膳食纤维、优质蛋白、钙质、叶酸以及各类营养元素的食物,能够提供给孕妇较多的营养成分。另外,有些食物一定不要过多食用,否则不……这几位女星整容痕迹明显,却嘴硬不承认,网友是人都能看出来一说到整容,可能大家都会不自觉的联想到娱乐圈里的明星,明星之所以长得精致,其实跟整容有着密不可分的联系。近几年伴随着经济水平的稳步提升以及人们思想的开放,除了明星之外,普……李小冉李乃文我们的日子强势开播,演绎温情故事,超级好看2月9日,由李小冉和李乃文主演的《我们的日子》在CCTV1黄金时间强势开播。该剧跨越近三十年的岁月里描绘了时代变迁里几个家庭之间的温情幸福故事,最典型的中国邻里街坊之间在……2023销量最好的98英寸电视排行创维第2,TCL第3,小米就98英寸大电视的市场来说,其实变化最大的就在过去的2022年,为什么要这么说呢?因为在2021年的大电视市场中,生产销售98寸电视的厂商主要有5家,其中包括老牌电视机厂商海信……狂飙中等离子电视有什么好?多年来业界流传着这样一句话:外行买液晶,内行买等离子。其原因在于等离子电视除了在动态清晰度方面表现优异,在视觉舒适度、色彩还原度、对比度、可视角度等方面的性能也较好。等离……A股明天必将变盘,是站上3180还是跌到3130?继续给出精又一次预判精准,如果是一天两天就算了,可曾想连续准了一个月,甚连点位都没有什么偏差。毫不夸张的说,这样的预判想找个掰手腕的都难。对此,刚刚刷到这篇帖子的朋友不要认为是吹牛,因为……郭晶晶认真打扮真美!把99块飞跃鞋穿出大牌感,配皮衣优雅又贵皮衣是一种广受大家喜爱的服装单品,从飞行夹克到机车皮衣,无论是男装还是女装,都可以用皮衣穿出帅气又有个性的风格。随着时尚发展,皮衣的款式、长度、颜色和版型也发生很多变化,皮衣在……顺丰无人机制造基地落户江西,首期投资30亿年内竣工日前,顺丰高端物流无人机制造基地项目正式备案。该项目位于江西赣州,首期投资30亿元。建设单位为江西丰羽顺途科技有限公司,由顺丰子公司丰翼科技(深圳)有限公司全资控股。据了……
水煮内脏,当心热射病!它不是普通的重度中暑就在近日,国内热射病上了热搜,地球的另一半也没有躲过!美国一位著名前橄榄球员马里恩巴伯(MarionBarber)突然暴毙,内脏就像煮过一样,最终惨死,引起了全美的关注!……潇洒贵妇林青霞18个佣人10只看门狗,她到底有多壕无人性?她过生日老公就送上11亿别墅,光佣人就配备了18个,给女儿发红包一次就豪掷1。6亿,名下更是坐拥多辆劳斯莱斯。潇洒贵妇林青霞到底多有钱?前不久林青霞在香港飞鹅山的豪……冬病夏治三伏贴,穴位贴敷正当时!有这4种疾病的人一定要贴山西省中医院肿瘤二科刘妍妍伏天将至,中医认为天人合一,三伏天气温炎热,人体阳气旺盛,腠理开泄,气血趋于体表,是冬病夏治的最佳时机,三伏贴就是最常见的方法之一,此时采用中药……OPPOFindX5Pro凭实力大火,FindX3打响降价第经过多次调价OPPOFindX5Pro的起步价已经降至4999元,购买价值极高。该机提供了黑釉和白瓷两种非常简洁诱人的配色方案,采用了更高级的陶瓷盖板,温润细腻,防刮防腐蚀。也……爆料OPPO骁龙8直屏机暂定8月发布采用IMX8系新主摄有新就只国内其他智能手机品牌正在如火如荼发布或预热搭载高通骁龙8旗舰处理器的新机的时候,OPPO也终于坐不住了,近日,关于OPPO将发布搭载骁龙8处理器新机的消息也开始陆续爆料出来……篮网选中交易掉的27号秀,今天爆发了!砍20分13板,助队战今天凯尔特人以103:92,战胜勇士。数据方面:勇士:怀斯曼6分7篮板3封盖,穆迪21分3篮板4助攻3抢断,库明加29分2篮板,桑托斯12分8篮板,迈克朗9分,威瑟斯庞9……这三类手机千万不能买,牢记购机的三不碰原则,远离消费陷阱其实买手机也有技巧,并不是每一款手机都值得买,牢记今天给大家总结的购机三不碰原则,让你轻松远离消费误区,你也能买到好手机。手机处理器太差的不要碰一款手机的具体表现如何,性……疑似发声质疑!本土得分王为何无缘中国男篮大名单?曾被中国球迷寄予厚望的小前锋阿布都沙拉木,近日,在中国男篮止步亚洲杯八强后,他随后更新ins,并分享了一段歌词我不晓得他比我好哪,这个疑似表达了自己没有入选国家队的不满,引起了……在勇士退役球衣有多难?只有2人获老板承诺,另外4人会被退役么NBA球衣退役是指:NBA联盟球队为自己的球员举办球衣退役仪式,在这以后别的球员,都不可以再用这件球衣的号码。比如湖人队的8号和24号球衣是科比布莱恩特的,已经退役,那么……费德勒退役!最爱西班牙蚊子胡安。卡洛斯。费雷罗41岁瑞士网球天王费德勒宣布退役!几天前就看到了新闻,一直想说点什么,却又忘记了从何说起!肯定是再也看不到那个熟悉的赛场上矫健奔跑的身影了,再也看不到费德勒式的猛男握拳回头了!……适合工薪族开的两款车,最低才4。89万,好开,动力强劲还是国十年逸动再进化后台有小伙伴要求,帮忙介绍两款家庭适用型的新车。今天就给大家介绍两款国企长安旗下的新车,这两款新车都是人气车型,第一款车型是长安Lumin,有所了解的小伙伴……毛岸英牺牲40年后,刘思齐才收到抚恤金,改嫁后以长子名纪念前毛岸英墓地1990年10月,中国人民志愿军烈属代表团受邀赴朝鲜,参加朝方举行的中国人民志愿军赴朝参战40周年纪念活动。10月22日,金日成在平壤接见了志愿军烈属代表团全体……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网