摘要:自己寫語句執(zhí)行,這可能是最傻的一種方法了,不過卻能保證事情完全按照自己的想法執(zhí)行。
遇到的問題
golang對于基本類型初始化的處理,是自動給基本類型賦值為默認(rèn)值。比如:
var i int//在這里如果不對i做任何賦值,那么i的值為零
這個特性在很多地方能夠避免訪問到未初始化變量的尷尬,但是由此也引出了另外一個問題,就是在進(jìn)行數(shù)據(jù)庫訪問操作時應(yīng)該如果對待這樣的默認(rèn)值。
現(xiàn)在我們假設(shè)一個場景,表A有3個字段{AID int,AField1 string,AField2 string},表B也有3個字段{ID int,BField1 string,REF_AID int},其中表B中的REF_AID是外鍵對應(yīng)表A中的AID。對應(yīng)在GO中的數(shù)據(jù)結(jié)構(gòu)應(yīng)該為:
type A struct{ AID int//主鍵 AField1 string AField2 string } type B struct{ BID int//主鍵 BField1 string REF_AID int//外鍵,對應(yīng)AID }
在new對象B的時候,B中的三個值就分別被默認(rèn)的初始化為{0,"",0},如果此時不對內(nèi)容做任何操作,直接執(zhí)行插入,問題就可能會變得很嚴(yán)重,因為A中很可能并沒有任何一條記錄的ID值為0,數(shù)據(jù)庫報錯,這條插入是一定會失敗。但是僅僅在數(shù)據(jù)庫層面上來看,數(shù)據(jù)庫的結(jié)構(gòu)是沒問題的,表B中的REF_AID可以為空,在其他的語言中,如果沒有對具體數(shù)據(jù)進(jìn)行初始化,該屬性會為空,對應(yīng)插入的時候也會為空,但是在golang中,由于語言級別的默認(rèn)初始化,使得這個插入過程會有大量的0的存在,觸犯到原本表的約束規(guī)則而導(dǎo)致插入失敗。
在orm中也沒有看到能夠解決這個問題的辦法,可能是我用的不夠仔細(xì),這個留待以后再說。
自己的一點想法把所有的數(shù)據(jù)庫中相關(guān)的表都添加一條默認(rèn)的以0為id的記錄,該記錄不需要有意義,只是用來防止歧義以及違反約束引起的操作失敗,特別是一些ref_表,因為其中數(shù)據(jù)變動不大,卻經(jīng)常與其他一些表存在外鍵關(guān)系。這樣做會給數(shù)據(jù)庫帶來一些額外的開銷,但是作為一個臨時的解決辦法似乎還不錯,至少能讓數(shù)據(jù)處理流程正確的運行。
從orm中解決問題。這個只是一個想法,不過這很可能變成一種無理的要求,因為這需要orm去判斷你的Field中存放的這個0到底是你自己就想指定的0值,還是你不想要卻被語言默認(rèn)初始化出來的0。
自己寫SQL語句執(zhí)行,這可能是最傻的一種方法了,不過卻能保證事情完全按照自己的想法執(zhí)行。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/17439.html
摘要:服務(wù)端渲染兩種方式根據(jù)上文介紹對服務(wù)端渲染利弊有所了解,我們可以根據(jù)利弊權(quán)衡取舍,最近在做服務(wù)端渲染的項目,找到多種服務(wù)端渲染解決方案,大致分為兩類。第一種方式傳統(tǒng)方式服務(wù)端渲染,解決用戶體驗和更好的,有諸多工具使用這種方式如的的等。 最近在開發(fā)一個服務(wù)端渲染工具,通過一篇小文大致介紹下服務(wù)端渲染,和服務(wù)端渲染的方式方法。在此文后面有兩中服務(wù)端渲染方式的構(gòu)思,根據(jù)你對服務(wù)端渲染的利弊權(quán)...
摘要:為了解決這一系列問題,微博從年開發(fā)了語言的框架,并基于此完成了服務(wù)化改造。這些經(jīng)歷之下微博也積累了一套服務(wù)治理型的服務(wù)化體系。的版,所要解決的是微博平臺內(nèi)部服務(wù)之間的調(diào)用,因此協(xié)議時,其實并沒有考慮到跨語言的問題,用的是對比較友好的。 showImg(https://segmentfault.com/img/remote/1460000012601596?w=1080&h=606); ...
摘要:前兩天在本地安裝了,熟悉了下命令之后,還是忍不住到上進(jìn)行了一波鏡像部署,以下是我的操作步驟和一些想法。但是如果想要將當(dāng)前目錄的文件復(fù)制進(jìn)里頭,首先要保證鏡像在運行,然后命令中的容器名使用我圈出來的那個名字。 前兩天在本地安裝了docker,熟悉了下命令之后,還是忍不住到centos上進(jìn)行了一波golang鏡像部署,以下是我的操作步驟和一些想法。準(zhǔn)備:一臺安裝了docker的可聯(lián)網(wǎng)的ce...
閱讀 1879·2021-11-15 11:39
閱讀 1245·2021-10-18 13:29
閱讀 1203·2021-08-31 09:42
閱讀 2753·2019-08-30 11:11
閱讀 2132·2019-08-26 12:12
閱讀 2122·2019-08-26 10:17
閱讀 3401·2019-08-23 18:38
閱讀 3237·2019-08-23 18:38