新聞中心
Golang 項目中 ORM 選擇,gorm xorm 對比
之前用 beego 中自帶的 orm,感覺有一些不是很滿足需求的地方,而且想要嘗試一些新的 orm,寫一篇記錄一下。
成都創(chuàng)新互聯(lián)長期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為宜城企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計,宜城網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
在 xorm 和 gorm 之間對比了一下:
p.s. 需要說明的是,對比非常初級,而且項目處于很早期,也抱著嘗試一下不行再改的心理,并沒有想要得到一個孰優(yōu)孰劣的結(jié)論。
想來想去,對于一個成熟的項目可能 gorm 更適合,但是 xorm 好像近期在頻繁 commit,有一種想要追趕的意思。
那我先試試 xorm ,不知道為什么選的這個,可能是想試試看新款吧。(大霧
2017/07/04
可怕,xorm 不支持外鍵關(guān)系。一對一啥的。
go語言里面實現(xiàn)對數(shù)據(jù)庫的操作,用什么包好
盡量不要使用ORM,簡單的數(shù)據(jù)庫交互是會省很多事。
但是一旦查詢語句越來越復(fù)雜,關(guān)聯(lián)表越來越多,當你發(fā)現(xiàn)正在使用的ORM框架做不到時再換其他框架代價會很大。為什么有那么多框架?就是沒有一個框架能解決所有哪怕是大多數(shù)問題。
建議只使用數(shù)據(jù)庫驅(qū)動庫,database/sql庫,可以完成所有g(shù)o語言與數(shù)據(jù)庫的交互。
Golang database/sql源碼分析
Gorm是Go語言開發(fā)用的比較多的一個ORM。它的功能比較全:
但是這篇文章中并不會直接看Gorm的源碼,我們會先從database/sql分析。原因是Gorm也是基于這個包來封裝的一些功能。所以只有先了解了database/sql包才能更加好的理解Gorm源碼。
database/sql 其實也是一個對于mysql驅(qū)動的上層封裝。”github.com/go-sql-driver/mysql”就是一個對于mysql的驅(qū)動,database/sql 就是在這個基礎(chǔ)上做的基本封裝包含連接池的使用
下面這個是最基本的增刪改查操作
操作分下面幾個步驟:
因為Gorm的連接池就是使用database/sql包中的連接池,所以這里我們需要學(xué)習(xí)一下包里的連接池的源碼實現(xiàn)。其實所有連接池最重要的就是連接池對象、獲取函數(shù)、釋放函數(shù)下面來看一下database/sql中的連接池。
DB對象
獲取方法
釋放連接方法
連接池的實現(xiàn)有很多方法,在database/sql包中使用的是chan阻塞 使用map記錄等待列表,等到有連接釋放的時候再把連接傳入等待列表中的chan 不在阻塞返回連接。
之前我們看到的Redigo是使用一個chan 來阻塞,然后釋放的時候放入空閑列表,在往這一個chan中傳入struct{}{},讓程序繼續(xù) 獲取的時候再從空閑列表中獲取。并且使用的是鏈表的結(jié)構(gòu)來存儲空閑列表。
database/sql 是對于mysql驅(qū)動的封裝,然而Gorm則是對于database/sql的再次封裝。讓我們可以更加簡單的實現(xiàn)對于mysql數(shù)據(jù)庫的操作。
標題名稱:go語言好用的orm庫 go語言常用標準庫
鏈接分享:http://ef60e0e.cn/article/doghped.html