1.go sqlmocks的码分使用
2.golandè¿ç¨debugï¼
go sqlmocks的使用
本文主要介绍如何使用 DATA-DOG/go-sqlmock 来模拟数据库操作,解决使用 beego ORM 进行 `InsertOrUpdate` 操作时遇到的码分 bug。当在开发过程中遇到数据库操作相关的码分问题,特别是码分遇到与主键冲突的情况,可以通过模拟数据库返回结果来快速定位问题,码分进而解决问题。码分多用户点餐系统源码
案例情景如下:有一个 `TExchangeInfo` 结构体,码分实例化后填充数据,码分然后执行 `InsertOrUpdate` 操作,码分当数据存在时,码分使用更新,码分当数据不存在时才插入。码分
使用 `sqlmock` 的码分方法相对简单,它通过 `sqlmock.New()` 返回一个标准的码分 `sql.DB` 结构体实例指针和一个 `sqlmock.Sqlmock` 结构体实例。通过 `*sql.DB` 可以传递给 ORM 进行数据库交互。码分idea开发ssm源码
例如,使用 `beego ORM` 时,可以通过 `orm.NewOrmWithDB` 方法实例化并指定连接句柄。但在使用过程中,可能会遇到 `panic` 错误,这是因为 `sqlmock.Sqlmock` 需要在模拟测试中指定期望执行的查询语句及其返回结果。
在 `mock` 测试中,双人夺宝的源码需要添加期望执行的查询语句和假定的返回结果。例如,在 `beego ORM` 启动时,会先执行 `SELECT TIMEDIFF...` 和 `SELECT ENGINE...` 两个语句,因此在期望中也需要包含这两个语句。
在 `mock` 测试后,可以打印出实际执行的线程池迁移源码 SQL 语句,以便分析问题。在分析输出语句时,发现 `beego ORM` 使用的是数据库自身的 `insert or update` 功能,但语句中没有包含主键的痕迹。
问题在于 `beego ORM` 在执行过程中过滤掉了主键,可能是因为在处理含有 `auto` 属性的字段时,忽略了主键的测试类源码算法处理。这可能是因为 `auto` 属性是 ORM 层的标记,用于指示字段应进行自动增长,而不是数据库层面的主键标记。
在源码中,发现问题出现在 `github.com/astaxie/beego@v1..2/orm/db_mysql.go` 文件中的第 行代码,以及 `github.com/astaxie/beego@v1..2/orm/db.go` 文件中的第 行代码。通过断点调试,发现当字段的 `tag` 包含 `auto` 属性时,ORM 会跳过主键的处理。
解决方法是去除字段的 `auto` 标记,确保 ORM 正确处理主键。在实际开发中,应使用 `pk` 标记来明确指定字段为数据库的主键。
经过与开发者沟通得知,开发者在创建数据库交互使用的数据结构体时,习惯在主键字段上添加 `auto` 标记,以表示主键自增。但实际上,`auto` 标记只用于 ORM 层的指示,而非数据库层面的主键标识。正确的做法是使用 `pk` 标记来明确指定主键。
通过去除 `auto` 标记,并使用 `pk` 标记正确指定主键,问题得到解决。这表明在使用 ORM 时,明确理解标记的含义及其在不同层面上的用途至关重要。
golandè¿ç¨debugï¼
vscodeågolandè¿ç¨è¿æ¥Linuxç³»ç»
使ç¨vscodeä¸çsshè¿æ¥è¿ç¨çLinuxæºå¨æ¶ï¼vscodesshserverå¡å¨copyingvscodeservertohostwithscpãææ¶åvscodesshåå¤æ示è¾å ¥å¯ç ï¼è¿æ¯æ æ³è¿æ¥ã
vscodesshæåãç±äºvscodesshåå°ç æ¯å ¥ä¾µï¼å¯¼è´vscodesshæåï¼å æ¤å ¶è¿æ¥linuxç¯å¢åï¼ä¸è½ä½¿ç¨linuxç³»ç»ãvscodesshæ¯ä¸ç§ç½ç»åè®®ï¼ç¨äºå å¯ä¸¤å°è®¡ç®æºä¹é´çéä¿¡ï¼å¹¶ä¸æ¯æåç§èº«ä»½éªè¯æºå¶ã
æ们å å¨windows主æºä¸ä¸è½½TigerVNC软件å ãTigerVNCæ¯ä¸æ¬¾å¼æºå è´¹çVNCè¿æ¥è½¯ä»¶ï¼æ们å¯ä»¥éè¿å®å¯¹å¸¦æ¡é¢çlinux主æºè¿è¡è¿ç¨ãè¿éï¼æ们ä»SourceForgeç½ç«ä¸è½½TigerVNC软件å ã
äºä¸ªé常好ç¨çLinuxè¿ç¨è¿æ¥å·¥å ·ï¼ç¬¬ä¸æ¬¾ï¼Xshell(httpsï¼//)Xshellæ¯ä¸ä¸ªé常强大çå®å ¨ç»ç«¯æ¨¡æ软件ï¼å®æ¯æSSH1ï¼SSH2ï¼ä»¥åWindowså¹³å°çTELNETåè®®ã
golangä¸è½ä½¿ç¨debug
ç¼è¯centosä¸çå¯æ§è¡æ件çæ¶åéè¦äº¤åç¼è¯ã
debugæ¯ä¸ä¸ªè°è¯å½ä»¤ï¼æ¬æ¥å°±æ¯å¤é¨å½ä»¤ï¼ä¸æ¯å é¨å½ä»¤ãå ¨åæ¯debug.exeï¼DOSçå é¨å½ä»¤æ¯ç±Commondæä¾çï¼DOSå¯å¨æ¶ä¼å è½½å°å åä¸æ以å«å é¨å½ä»¤ã
golang空æéå¡æ»è§£å³æ¹æ³å¦ä¸ï¼åºéçä½ç½®å¨æ§è¡Excuteå½æ°å¤ï¼debugè¿æ¯æç´¢ç¾åº¦é½æ¾ä¸å°è§£å³æ¹æ¡ã解å³æ¹æ¡å°±æ¯ä¸ç¨Golandç¼è¯æ件ãç´æ¥ä½¿ç¨gobuildç¼è¯æ件åï¼åæ§è¡ï¼è®¿é®ç½é¡µå°±ä¸æ¥éäºã
Goè¯è¨å¨ç¼ºç设置ä¸ä¸ä¼ç产å¥æºè½¬å¨ãä½æ¯å½ä½ æGOTRACEBACKç¯å¢åé设置æâcrashâï¼ä½ å°±å¯ä»¥ç¨Ctrl+backslashæ触åå¥æºè½¬å¨ã
æ¹æ³ä¸ï¼å®è£ ä½ç³»ç»å°±å¯ä»¥ä½¿ç¨debugï¼å¦windowsxpçä½ãwin7çä½ãwin8çä½ãwinçä½é½å¯ä»¥ä½¿ç¨debugãæ¹æ³äºï¼å¦æä½ ä¸å®è¦ç¨ä½ç³»ç»ï¼å½ç¶ä¹å¯ä»¥ã
设置ç¯å¢åéGOPATHGOPATHçå¼å¯ä»¥æå¤ä¸ªï¼ç¨åè§åå·é´éï¼ä½ä¸è½ä»¥å ¶ç»æï¼è®¾ç½®å®æåéè¦éæ°ågomobileinitã
goè¯è¨ç¼è¾å¨golandææ ·ædebugèåä¾æ¬¡éæ©âRunâ-âEditconfigurationsâå¦ä¸å¾æ示ï¼å¨å¼¹åºç对è¯æ¡ä¸æç §å¦ä¸å¾æ示é ç½®ï¼ç¹å»âdebugâæé®ï¼å¦ä¸å¾æ示ï¼è®¾ç½®æç¹å°±å¯ä»¥å¼å§è°è¯å¦ã
è¿æ¯å 为ï¼golandå¨debugæ¶ä½¿ç¨çæ¯dlvæ件ï¼è¯¥æ件è¿ä¸æ¯æä½ç¨åºçè°è¯ï¼ç´æ¥æ§è¡runå°±å¯ä»¥äºãå¨ä½¿ç¨å½ä»¤è¡ç¼è¯goç¨åºæ¶ï¼å¯ä»¥ä½¿ç¨goenvå½ä»¤æ¥çå½åç¼è¯ç¯å¢è®¾ç½®ã
)Printï¼è¾åºå°æ§å¶å°(ä¸æ¥åä»»ä½æ ¼å¼åï¼å®çä»·äºå¯¹æ¯ä¸ä¸ªæä½æ°é½åºç¨%v)printå¨golangä¸æ¯å±äºè¾åºå°æ åé误æµä¸å¹¶æå°ï¼å®æ¹ä¸å»ºè®®åç¨åºæ¶åç¨å®ã
a.使ç¨æ¨çææ¬ç¼è¾å¨ï¼å¨fuzzç®å½ä¸å建ä¸ä¸ªå为main.goçæ件ãç¬ç«ç¨åºï¼ä¸åºç¸åï¼å§ç»ä½äºpackageä¸mainãæ¤å½æ°å°æ¥åstringï¼ä½¿ç¨byteè¿è¡å¾ªç¯ï¼å¹¶å¨æåè¿åå转çå符串ã
Linuxå¹³å°ä»¥gdb为常ç¨ãIDEèªå¸¦çè°è¯å¨ä»¥VC0为ä¾ï¼ç¼åå®ä»£ç åï¼æå¿«æªé®çFï¼å³å¯è¿å ¥è°è¯ï¼æ¤æ¶å³é®ï¼éæ©âgotodisassemblyå³å¯æ¥çå°ç¨åºçåæ±ç¼ä»£ç ãä¸è¬è¿ç§æ åµï¼ä¸»è¦æ¯ä¸ºäºå¯¹Cè¯è¨è¿è¡åæ±ç¼å¦ä¹ ã
ä½ å¨ç¼è¯å¨éé¢buildä¸ä¸ï¼ç¶åå»\bin\debugç®å½ä¸æ¾.exeexeå°±æ¯å¯æ§è¡æ件äºãè¿è¡çæ¶åå¯è½éè¦ç¨å°debugç®å½ä¸çå ¶ä»æ件(å¦é ç½®æ件ãdllç)ï¼æ以éè¦ædebugä¸çæææ件é½æ¾å°ä¸èµ·ã
goland,cgoå è½½ä½DLLéå°çé®é¢ç»è¿æç´¢çæµï¼æ¯ç®æ æºå¨æ¶æéæ©é误导è´çãä½æ¯å¨ç¯å¢é ç½®ä¸ï¼å·²ç»æ£ç¡®çéæ©äºArch为ï¼å°è¯ä½¿ç¨liteIDEæè ç´æ¥ä½¿ç¨å½ä»¤è¡ç¼è¯ï¼é½è½å¤æ£å¸¸ç¼è¯ãå¯ç¬ä½¿ç¨GoLandä¸è¡ã
å¦ä½ä½¿ç¨GoLandè°è¯beego项ç®1ãåèä¸é¢åçææ¡£è¿æ¥åå¤ä¸ä¸ªbeego项ç®ã
2ãå°æ°å»ºçBeegoDemo1ï¼å¯¼å ¥å°GOLANDä¸é ç½®gomodulesågoproxyï¼é ç½®æ¹æ³è§ï¼GOLANDä¸é ç½®GOMODULEåGOPROXYç´æ¥ç¹å»è¿è¡æéè¿beerunæ¥è¿è¡ãbeegoæ¯åºäºå «å¤§ç¬ç«ç模åä¹ä¸æ建çï¼æ¯ä¸ä¸ªé«åº¦è§£è¦çæ¡æ¶ã
3ã项ç®ç®¡çæ¹å¼ä¸ç¬¦ågoå®æ¹æ åã代ç æ示ä¸è½èªå¨å¯¼å ¥ï¼eclipseä¹ä¸è½ï¼ï¼ä¸è¿å¦æä½ ç项ç®æ¯ä»¥å 为åä½çï¼é£ä¹å¦å½å«è®ºã
4ãè¿è¡nohup./beego_projectå ³éç»ç«¯ãå¨æ¬æºæµè§å¨ä¸è¾å ¥IPå°å+端å£å·æè æå¡å¨ç½åãå°±å¯ä»¥çå°ä½ ç项ç®äºãè¿æ¯æ¬äººçä¸ä¸ªç»æ项ç®ãç»å½çç¨æ·ååå¯ç é½æ¯adminãcookiesæææ¶å¸¸ä¸ºï¼7*å°æ¶ã
5ãéå¨serviceä¸å®è£ beegoæºç åbeegoå¼åå·¥å ·Beegoå¼åå·¥å ·å¸¦æå¾å¤Beegoå½ä»¤ãæ¯å¦beegonewå建项ç®ï¼beegorunè¿è¡é¡¹ç®çãç¨beegoè¿è¡é¡¹ç®ï¼é¡¹ç®èªå¸¦çæ´æ°ã