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