新聞中心
Fields/FieldsEx字段過(guò)濾
?Fields用于指定需要操作的表字段,包括查詢(xún)字段、寫(xiě)入字段、更新字段等過(guò)濾;

創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供正藍(lán)網(wǎng)站建設(shè)、正藍(lán)做網(wǎng)站、正藍(lán)網(wǎng)站設(shè)計(jì)、正藍(lán)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、正藍(lán)企業(yè)網(wǎng)站模板建站服務(wù),十載正藍(lán)做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
?FieldsEx用于例外的字段指定,可用于查詢(xún)字段、寫(xiě)入字段、更新字段等過(guò)濾;
Fields示例
- 假如?
user?表有4個(gè)字段?uid?, ?nickname?, ?passport?, ?password?。 - 查詢(xún)字段過(guò)濾
// SELECT `uid`,`nickname` FROM `user` ORDER BY `uid` asc
db.Table("user").Fields("uid, nickname").Order("uid asc").All()
- 寫(xiě)入字段過(guò)濾
m := g.Map{
"uid" : 10000,
"nickname" : "John Guo",
"passport" : "john",
"password" : "123456",
}
db.Table(table).Fields("nickname,passport,password").Data(m).Insert()
// INSERT INTO `user`(`nickname`,`passport`,`password`) VALUES('John Guo','john','123456')
FieldsEx示例
- 假如?
user?表有4個(gè)字段?uid?, ?nickname?, ?passport?, ?password?。 - 查詢(xún)字段排除
// SELECT `uid`,`nickname` FROM `user`
db.Table("user").FieldsEx("passport, password").All()
- 寫(xiě)入字段排除
m := g.Map{
"uid" : 10000,
"nickname" : "John Guo",
"passport" : "john",
"password" : "123456",
}
db.Table(table).FieldsEx("uid").Data(m).Insert()
// INSERT INTO `user`(`nickname`,`passport`,`password`) VALUES('John Guo','john','123456')
OmitEmpty空值過(guò)濾
當(dāng) ?map/struct? 中存在空值如 ?nil?,?""?,?0? 時(shí),默認(rèn)情況下,?gdb?將會(huì)將其當(dāng)做正常的輸入?yún)?shù),因此這些參數(shù)也會(huì)被更新到數(shù)據(jù)表。?OmitEmpty?特性可以在將數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)之前過(guò)濾空值數(shù)據(jù)的字段。
相關(guān)方法:
func (m *Model) OmitEmpty() *Model
func (m *Model) OmitEmptyWhere() *Model
func (m *Model) OmitEmptyData() *Model ?OmitEmpty?方法會(huì)同時(shí)過(guò)濾?Where?及?Data?中的空值數(shù)據(jù),而通過(guò)?OmitEmptyWhere/OmitEmptyData?方法可以執(zhí)行特定的字段過(guò)濾。
寫(xiě)入/更新操作
空值會(huì)影響于寫(xiě)入/更新操作方法,如?Insert?, ?Replace?, ?Update?, ?Save?操作。如以下操作(以?map?為例,?struct?同理):
// UPDATE `user` SET `name`='john',update_time=null WHERE `id`=1
db.Table("user").Data(g.Map{
"name" : "john",
"update_time" : nil,
}).Where("id", 1).Update()針對(duì)空值情況,我們可以通過(guò)?OmitEmpty?方法來(lái)過(guò)濾掉這些空值。例如,以上示例可以修改為:
// UPDATE `user` SET `name`='john' WHERE `id`=1
db.Table("user").OmitEmpty().Data(g.Map{
"name" : "john",
"update_time" : nil,
}).Where("id", 1).Update()對(duì)于?struct?數(shù)據(jù)參數(shù),我們也可以進(jìn)行空值過(guò)濾。操作示例:
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(),
}
db.Table("user").OmitEmpty().Data(user).Insert()
// INSERT INTO `user`(`id`,`nickname`,`update_time`) VALUES(1,'john','2019-10-01 12:00:00')注意喲,批量寫(xiě)入/更新操作中?OmitEmpty?方法將會(huì)失效,因?yàn)樵谂坎僮髦?,必須保證每個(gè)寫(xiě)入記錄的字段是統(tǒng)一的。
關(guān)于?omitempty?標(biāo)簽與?OmitEmpty?方法:
- 針對(duì)于?
struct?的空值過(guò)濾大家會(huì)想到?omitempty?的標(biāo)簽。該標(biāo)簽常用于?json?轉(zhuǎn)換的空值過(guò)濾,也在某一些第三方的?ORM?庫(kù)中用作?struct?到數(shù)據(jù)表字段的空值過(guò)濾,即當(dāng)屬性為空值時(shí)不做轉(zhuǎn)換。 - ?
omitempty?標(biāo)簽與?OmitEmpty?方法所達(dá)到的效果是一樣的。在?ORM?操作中,我們不建議對(duì)?struct?使用?omitempty?的標(biāo)簽來(lái)控制字段的空值過(guò)濾,而建議使用?OmitEmpty?方法來(lái)做控制。因?yàn)樵摌?biāo)簽一旦加上之后便綁定到了?struct?上,沒(méi)有辦法做靈活控制;而通過(guò)?OmitEmpty?方法使得開(kāi)發(fā)者可以選擇性地、根據(jù)業(yè)務(wù)場(chǎng)景對(duì)?struct?做空值過(guò)濾,操作更加靈活。
數(shù)據(jù)查詢(xún)操作
空值也會(huì)影響數(shù)據(jù)查詢(xún)操作,主要是影響?where?條件參數(shù)。我們可以通過(guò)?OmitEmpty?方法過(guò)濾條件參數(shù)中的空值。
使用示例:
// SELECT * FROM `user` WHERE `passport`='john' LIMIT 1
r, err := db.Table("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 := db.Table("user").OmitEmpty().Where(user).One()
// SELECT * FROM `user` WHERE `passport`='john' LIMIT 1
OmitNil空值過(guò)濾
當(dāng) ?map/struct? 中存在空值如nil?時(shí),默認(rèn)情況下,?gdb?將會(huì)將其當(dāng)做正常的輸入?yún)?shù),因此這些參數(shù)也會(huì)被更新到數(shù)據(jù)表。?OmitNil?特性可以在將數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)之前過(guò)濾空值數(shù)據(jù)的字段。與?OmitEmpty?特性的區(qū)別在于,?OmitNil?只會(huì)過(guò)濾值為nil的空值字段,其他空值如?""?,?0?并不會(huì)被過(guò)濾。
相關(guān)方法:
func (m *Model) OmitNil() *Model
func (m *Model) OmitNilWhere() *Model
func (m *Model) OmitNilData() *Model ?OmitEmpty?方法會(huì)同時(shí)過(guò)濾?Where?及?Data?中的空值數(shù)據(jù),而通過(guò)?OmitEmptyWhere/OmitEmptyData?方法可以執(zhí)行特定的字段過(guò)濾。
Filter字段過(guò)濾(已內(nèi)置)
?
gdb?可以自動(dòng)同步數(shù)據(jù)表結(jié)構(gòu)到程序緩存中(緩存不過(guò)期,直至程序重啟/重新部署),并且可以過(guò)濾提交參數(shù)中不符合表結(jié)構(gòu)的數(shù)據(jù)項(xiàng),該特性可以使用?
Filter?方法實(shí)現(xiàn)。常用于新增/刪除操作中輸入?
map/struct/[]map/[]string?參數(shù)類(lèi)型的場(chǎng)景。
使用示例,假如?
user?表有4個(gè)字段?
uid?, ?
nickname?, ?
passport?, ?
password?:
r, err := db.Table("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為不存在的字段,在寫(xiě)入數(shù)據(jù)時(shí)將會(huì)被過(guò)濾掉,不至于被構(gòu)造成寫(xiě)入?
SQL?中產(chǎn)生執(zhí)行錯(cuò)誤。
數(shù)據(jù)庫(kù)沒(méi)有設(shè)計(jì)為?
Data?方法做自動(dòng)過(guò)濾,而是需要開(kāi)發(fā)者調(diào)用?
Filter?方法來(lái)手動(dòng)指定過(guò)濾,目的是友好地提醒開(kāi)發(fā)者可能誤寫(xiě)/傳遞錯(cuò)誤了字段名稱(chēng)。如果強(qiáng)制性的自動(dòng)過(guò)濾可能會(huì)引起難以預(yù)料的業(yè)務(wù)邏輯異常,例如,由于字段名稱(chēng)拼寫(xiě)錯(cuò)誤導(dǎo)致自動(dòng)過(guò)濾了本來(lái)需要輸入的字段,導(dǎo)致寫(xiě)入數(shù)據(jù)庫(kù)的數(shù)據(jù)不完整。
從?GOFrame v1.15.7?版本開(kāi)始,根據(jù)社區(qū)整體反饋,為提高組件易用性,?filter?特性被設(shè)置為默認(rèn)開(kāi)啟,不再需要顯示調(diào)用,?Filter?方法已被標(biāo)記廢棄。
當(dāng)前標(biāo)題:創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈?zhǔn)讲僮?字段過(guò)濾
文章URL:http://fisionsoft.com.cn/article/dhjcdpc.html


咨詢(xún)
建站咨詢(xún)
