成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ORM鏈式操作的字段過濾&為什么GoFrame不支持migrate功能?

開發 后端
goframe是一款用于企業生產級別的框架,各個模塊設計嚴謹,工程實踐的細節處理得比較好。為安全性保證、防止誤操作,Update及Delete方法必須帶有Where條件才能提交執行,否則將會錯誤返回,錯誤信息如:there should be WHERE condition statement for XXX operation。

初學者必須搞懂:

在 Go 中,沒有null、none、NULL、None

任何類型在未初始化時都對應一個零值:布爾類型是 false ,整型是 0 ,字符串是 ""

而指針,函數,interface,slice,channel和map的零值都是 nil

結合場景,平衡利弊,做出取舍

下圖是一位讀者問我的問題,我翻遍了文檔也沒找到相關的資料,猜測應該是不支持的。

圖片

于是問了goframe作者,被明確告知:goframe不支持,并且以后也不會支持。

作者也詳細解答了不支持的原因,goframe作者團隊的考慮是這樣的:

圖片

因為我做的項目比較多,在數據庫表結構管理方面踩過坑。還是比較能接受goframe作者觀點的。

migrate這種功能確實能方便開發者,但是在企業級項目中,尤其是TOB的業務,穩定是第一要務。migrate功能雖然方便,但是不夠嚴謹,如果沒有很強的規范去約束團隊成員的使用,很容易出問題,出了問題就不是小問題,所以不敢用。

這也讓我想起了另外一件事情:

前段時間在review代碼時,發現了一個“無條件”的刪除腳本在運行,心頭一驚啊!這要是把數據刪了可麻煩了。但是查詢DB發現沒有刪除數據。

我詳細查了官方文檔,沒有被刪數據的原因是這樣的:

goframe是一款用于企業生產級別的框架,各個模塊設計嚴謹,工程實踐的細節處理得比較好。為安全性保證、防止誤操作,Update及Delete方法必須帶有Where條件才能提交執行,否則將會錯誤返回,錯誤信息如:there should be WHERE condition statement for XXX operation。

好吧,感謝,真是救我狗命了,哈哈。

也正是因為自己做了很多項目,踩了很多坑,碰到了不少這種細節問題。

目前才有了“從追求開發效率”到“追求項目穩定性”的轉變。

在這里也回答一下最近大家私信我的問題吧:“為什么我使用goframe框架做這個電商實戰項目?”

原因很簡單,我結合自己的經歷,覺得GoFrame是一個適合企業級項目比較嚴謹的框架,能少踩坑,避免一些麻煩。雖然入門門檻是有的,但是在“工程化開發設計”的規范下,后續的維護成本還是比較低的。所以才帶大家使用這個框架做電商項目的。

好了,不同的場景,不同的項目有不同的解決方案,不同的優選框架。這個問題沒有標準答案,結合自己的需求去選擇合適的解決方案吧。

歡迎大家找我交流,多提像這位讀者一樣有價值的問題,一起進步!

Fields/FieldsEx字段過濾

Fields  用于指定需要操作的表字段,包括查詢字段、寫入字段、更新字段等過濾;

FieldsEx  用于例外的字段指定,可用于查詢字段、寫入字段、更新字段等過濾;

?Fields??示例

假如user?表有4個字段uid?,  nickname?,  passport?,  password。

查詢字段過濾

 // SELECT `uid`,`nickname` FROM `user` ORDER BY `uid` asc
g.Model("user").Fields("uid, nickname").Order("uid asc").All()

寫入字段過濾

m := g.Map{
"uid" : 10000,
"nickname" : "John Guo",
"passport" : "john",
"password" : "123456",
}
g.Model(table).Fields("nickname,passport,password").Data(m).Insert()
// INSERT INTO `user`(`nickname`,`passport`,`password`) VALUES('John Guo','john','123456')

?FieldsEx??示例

1.假如user?表有4個字段uid?,  nickname?,  passport?,  password。

2.查詢字段排除

 // SELECT `uid`,`nickname` FROM `user`
g.Model("user").FieldsEx("passport, password").All()

3.寫入字段排除

 m := g.Map{
"uid" : 10000,
"nickname" : "John Guo",
"passport" : "john",
"password" : "123456",
}
g.Model(table).FieldsEx("uid").Data(m).Insert()
// INSERT INTO `user`(`nickname`,`passport`,`password`) VALUES('John Guo','john','123456')

OmitEmpty空值過濾

當  map/struct?  中存在空值如  nil,"",0?  時,默認情況下,gdb?將會將其當做正常的輸入參數,因此這些參數也會被更新到數據表。OmitEmpty特性可以在將數據寫入到數據庫之前過濾空值數據的字段。

相關方法:

func (m *Model) OmitEmpty() *Model
func (m *Model) OmitEmptyWhere() *Model
func (m *Model) OmitEmptyData() *Model

OmitEmpty?方法會同時過濾Where及Data?中的空值數據,而通過OmitEmptyWhere/OmitEmptyData方法可以執行特定的字段過濾。

寫入/更新操作

空值會影響于寫入/更新操作方法,如Insert?,  Replace?,  Update?,  Save?操作。如以下操作(以map?為例,struct同理):

// UPDATE `user` SET `name`='john',update_time=null WHERE `id`=1
g.Model("user").Data(g.Map{
"name" : "john",
"update_time" : nil,
}).Where("id", 1).Update()

針對空值情況,我們可以通過OmitEmpty方法來過濾掉這些空值。例如,以上示例可以修改為:

// UPDATE `user` SET `name`='john' WHERE `id`=1
g.Model("user").OmitEmpty().Data(g.Map{
"name" : "john",
"update_time" : nil,
}).Where("id", 1).Update()

對于struct數據參數,我們也可以進行空值過濾。操作示例:

type User struct {
Id int `orm:"id"`
Passport string `orm:"passport"`
Password string `orm:"password"`
NickName string `orm:"nickname"`
CreateTime string `orm:"create_time"`
UpdateTime string `orm:"update_time"`
}
user := User{
Id : 1,
NickName : "john",
UpdateTime: gtime.Now().String(),
}
g.Model("user").OmitEmpty().Data(user).Insert()
// INSERT INTO `user`(`id`,`nickname`,`update_time`) VALUES(1,'john','2019-10-01 12:00:00')

注意喲,批量寫入/更新操作中OmitEmpty方法將會失效,因為在批量操作中,必須保證每個寫入記錄的字段是統一的。

關于omitempty?標簽與OmitEmpty方法:

針對于struct?的空值過濾大家會想到omitempty?的標簽。該標簽常用于json?轉換的空值過濾,也在某一些第三方的ORM?庫中用作struct到數據表字段的空值過濾,即當屬性為空值時不做轉換。

omitempty?標簽與OmitEmpty?方法所達到的效果是一樣的。在ORM?操作中,我們不建議對struct?使用omitempty?的標簽來控制字段的空值過濾,而建議使用OmitEmpty?方法來做控制。因為該標簽一旦加上之后便綁定到了struct?上,沒有辦法做靈活控制;而通過OmitEmpty?方法使得開發者可以選擇性地、根據業務場景對struct做空值過濾,操作更加靈活。

數據查詢操作

空值也會影響數據查詢操作,主要是影響where?條件參數。我們可以通過OmitEmpty方法過濾條件參數中的空值。

使用示例:

// SELECT * FROM `user` WHERE `passport`='john' LIMIT 1
r, err := g.Model("user").Where(g.Map{
"nickname" : "",
"passport" : "john",
}).OmitEmpty().One()
type User struct {
Id int `orm:"id"`
Passport string `orm:"passport"`
Password string `orm:"password"`
NickName string `orm:"nickname"`
CreateTime string `orm:"create_time"`
UpdateTime string `orm:"update_time"`
}
user := User{
Passport : "john",
}
r, err := g.Model("user").OmitEmpty().Where(user).One()
// SELECT * FROM `user` WHERE `passport`='john' LIMIT 1

OmitNil空值過濾

當  map/struct?  中存在空值如  nil?時,默認情況下,gdb?將會將其當做正常的輸入參數,因此這些參數也會被更新到數據表。OmitNil?特性可以在將數據寫入到數據庫之前過濾空值數據的字段。與OmitEmpty?特性的區別在于,OmitNil?只會過濾值為nil?的空值字段,其他空值如"",0并不會被過濾。

相關方法:

func (m *Model) OmitNil() *Model
func (m *Model) OmitNilWhere() *Model
func (m *Model) OmitNilData() *Model

OmitNil?方法會同時過濾Where及Data?中的空值數據,而通過OmitNilWhere/OmitNilData方法可以執行特定的字段過濾。

Filter字段過濾(已內置)

gdb?可以自動同步數據表結構到程序緩存中(緩存不過期,直至程序重啟/重新部署),并且可以過濾提交參數中不符合表結構的數據項,該特性可以使用Filter?方法實現。常用于新增/刪除操作中輸入map/struct/[]map/[]string參數類型的場景。

使用示例,假如user?表有4個字段uid?,  nickname?,  passport?,  password:

r, err := g.Model("user").Filter().Data(g.Map{
"id" : 1,
"uid" : 1,
"passport" : "john",
"password" : "123456",
}).Insert()
// INSERT INTO user(uid,passport,password) VALUES(1, "john", "123456")

其中id為不存在的字段,在寫入數據時將會被過濾掉,不至于被構造成寫入SQL中產生執行錯誤。

數據庫沒有設計為Data?方法做自動過濾,而是需要開發者調用Filter方法來手動指定過濾,目的是友好地提醒開發者可能誤寫/傳遞錯誤了字段名稱。如果強制性的自動過濾可能會引起難以預料的業務邏輯異常,例如,由于字段名稱拼寫錯誤導致自動過濾了本來需要輸入的字段,導致寫入數據庫的數據不完整。

從GoFrame v1.15.7?版本開始,根據社區整體反饋,為提高組件易用性,filter?特性被設置為默認開啟,不再需要顯示調用,Filter方法已被標記廢棄。

本文轉載自微信公眾號「 程序員升級打怪之旅」,作者「王中陽Go」,可以通過以下二維碼關注。

轉載本文請聯系「 程序員升級打怪之旅」公眾號。

責任編輯:武曉燕 來源: 程序員升級打怪之旅
相關推薦

2021-08-02 09:31:20

Python工具代碼

2021-10-27 07:15:36

Go 循環引用

2020-07-22 08:01:41

Python開發運算符

2020-10-09 06:48:19

Pythonswitch語句

2021-12-09 10:51:47

Go繼承

2021-12-15 07:49:22

Go語言設計

2021-02-01 13:53:53

StringlongJava

2024-01-01 08:10:40

Go語言map

2024-01-05 08:45:35

Go語言map

2024-05-28 08:55:52

2023-01-28 08:05:32

轉換Go泛型

2009-03-12 08:42:38

AndroidWMMTK

2021-06-11 00:03:31

鴻蒙智能手機

2021-11-08 11:02:01

Go函數重載

2021-01-22 15:31:47

JavaSwitchString

2021-07-13 08:09:34

微博推特評論

2009-03-11 17:32:22

聯發科WMAndroid

2014-06-05 15:16:49

Linux開源Flash

2024-03-08 08:51:59

Gomain函數

2020-07-09 09:56:48

Python語言開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久一区二区三区 | 中文字幕在线中文 | 亚洲国产专区 | 日本一区二区高清不卡 | 精品国产欧美一区二区三区成人 | 欧美视频免费在线 | 久久网一区二区三区 | 国产欧美在线观看 | 欧美一区2区三区3区公司 | 欧美高清视频一区 | 久久99久久 | 久久亚洲国产精品日日av夜夜 | 狠狠操天天操 | 亚洲国产成人一区二区 | 国产专区在线 | 91久久精品一区二区二区 | m豆传媒在线链接观看 | 日日天天 | 欧美视频在线观看 | 青草久久免费视频 | 狠狠爱综合 | 精品久久久久久 | 午夜视频在线免费观看 | 91精品国产欧美一区二区成人 | 黄a免费看 | 欧美视频二区 | 一区二区三区在线 | 欧 | 亚洲精品久久久久中文字幕欢迎你 | 欧美日韩国产精品一区 | 国产精品jizz在线观看老狼 | 中文字幕日韩在线 | 一区视频在线 | 欧美二区在线 | 日韩av第一页 | 亚洲欧美一区二区三区视频 | 97久久国产 | 天天操天天舔 | 国产成人综合亚洲欧美94在线 | 久草网站| 亚洲欧美综合精品另类天天更新 | 日韩精品一区二区三区在线观看 |