




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第golanggorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例目錄1.orm讀寫數(shù)據(jù)1.創(chuàng)建1.1.創(chuàng)建記錄1.2.默認(rèn)值1.3.在Callbacks中設(shè)置主鍵1.4.擴(kuò)展創(chuàng)建選項(xiàng)2.查詢2.1.Where查詢條件(簡單SQL)2.2.Where查詢條件(StructMap)2.3.Not條件查詢2.4.帶內(nèi)聯(lián)條件的查詢2.5.Or條件查詢2.6.查詢鏈2.7.擴(kuò)展查詢選項(xiàng)2.8.FirstOrInit2.9.Attrs2.10.Assign2.11.FirstOrCreate2.12.Attrs2.13.Assign2.14.Select2.15.Order2.16.Limit2.17.Offset2.18.Count2.19.GroupHaving2.20.Join2.21.Pluck2.22.Scan2.23.Scopes2.24.指定表名3.預(yù)加載3.1.自定義預(yù)加載SQL3.2.嵌套預(yù)加載4.更新4.1.更新全部字段4.2.更新更改字段4.3.更新選擇的字段4.4.更新更改字段但不進(jìn)行Callbacks4.5.BatchUpdates批量更新4.6.使用SQL表達(dá)式更新4.7.在Callbacks中更改更新值4.8.額外更新選項(xiàng)5.刪除/軟刪除5.1.批量刪除5.2.軟刪除6.關(guān)聯(lián)6.1.創(chuàng)建/更新時(shí)跳過保存關(guān)聯(lián)6.2.tag設(shè)置跳過保存關(guān)聯(lián)
1.orm讀寫數(shù)據(jù)
1.創(chuàng)建
1.1.創(chuàng)建記錄
user:=User{Name:"Jinzhu",Age:18,Birthday:time.Now()}
db.NewRecord(user)//=主鍵為空返回`true`
db.Create(amp;user)
db.NewRecord(user)//=創(chuàng)建`user`后返回`false`
1.2.默認(rèn)值
您可以在gormtag中定義默認(rèn)值,然后插入SQL將忽略具有默認(rèn)值的這些字段,并且其值為空,并且在將記錄插入數(shù)據(jù)庫后,gorm將從數(shù)據(jù)庫加載這些字段的值。
typeAnimalstruct{
IDint64
Namestring`gorm:"default:'galeone'"`
Ageint64
varanimal=Animal{Age:99,Name:""}
db.Create(amp;animal)
//INSERTINTOanimals("age")values('99');
//SELECTnamefromanimalsWHEREID=111;//返回主鍵為111
//animal.Name='galeone'
1.3.在Callbacks中設(shè)置主鍵
如果要在BeforeCreate回調(diào)中設(shè)置主字段的值,可以使用scope.SetColumn,例如:
func(user*User)BeforeCreate(scope*gorm.Scope)error{
scope.SetColumn("ID",uuid.New())
returnnil
1.4.擴(kuò)展創(chuàng)建選項(xiàng)
//為Instert語句添加擴(kuò)展SQL選項(xiàng)
db.Set("gorm:insert_option","ONCONFLICT").Create(amp;product)
//INSERTINTOproducts(name,code)VALUES("name","code")ONCONFLICT;
2.查詢
//獲取第一條記錄,按主鍵排序
db.First(amp;user)
////SELECT*FROMusersORDERBYidLIMIT1;
//獲取最后一條記錄,按主鍵排序
db.Last(amp;user)
////SELECT*FROMusersORDERBYidDESCLIMIT1;
//獲取所有記錄
db.Find(amp;users)
////SELECT*FROMusers;
//使用主鍵獲取記錄
db.First(amp;user,10)
////SELECT*FROMusersWHEREid=10;
2.1.Where查詢條件(簡單SQL)
//獲取第一個(gè)匹配記錄
db.Where("name=","jinzhu").First(amp;user)
////SELECT*FROMusersWHEREname='jinzhu'limit1;
//獲取所有匹配記錄
db.Where("name=","jinzhu").Find(amp;users)
////SELECT*FROMusersWHEREname='jinzhu';
db.Where("name","jinzhu").Find(amp;users)
//IN
db.Where("namein()",[]string{"jinzhu","jinzhu2"}).Find(amp;users)
//LIKE
db.Where("nameLIKE","%jin%").Find(amp;users)
//AND
db.Where("name=ANDage=","jinzhu","22").Find(amp;users)
//Time
db.Where("updated_at",lastWeek).Find(amp;users)
db.Where("created_atBETWEENAND",lastWeek,today).Find(amp;users)
2.2.Where查詢條件(StructMap)
注意:當(dāng)使用struct查詢時(shí),GORM將只查詢那些具有值的字段
//Struct
db.Where(amp;User{Name:"jinzhu",Age:20}).First(amp;user)
////SELECT*FROMusersWHEREname="jinzhu"ANDage=20LIMIT1;
//Map
db.Where(map[string]interface{}{"name":"jinzhu","age":20}).Find(amp;users)
////SELECT*FROMusersWHEREname="jinzhu"ANDage=20;
//主鍵的Slice
db.Where([]int64{20,21,22}).Find(amp;users)
////SELECT*FROMusersWHEREidIN(20,21,22);
2.3.Not條件查詢
db.Not("name","jinzhu").First(amp;user)
////SELECT*FROMusersWHEREname"jinzhu"LIMIT1;
//NotIn
db.Not("name",[]string{"jinzhu","jinzhu2"}).Find(amp;users)
////SELECT*FROMusersWHEREnameNOTIN("jinzhu","jinzhu2");
//NotInsliceofprimarykeys
db.Not([]int64{1,2,3}).First(amp;user)
////SELECT*FROMusersWHEREidNOTIN(1,2,3);
db.Not([]int64{}).First(amp;user)
////SELECT*FROMusers;
//PlainSQL
db.Not("name=","jinzhu").First(amp;user)
////SELECT*FROMusersWHERENOT(name="jinzhu");
//Struct
db.Not(User{Name:"jinzhu"}).First(amp;user)
////SELECT*FROMusersWHEREname"jinzhu";
2.4.帶內(nèi)聯(lián)條件的查詢
注意:使用主鍵查詢時(shí),應(yīng)仔細(xì)檢查所傳遞的值是否為有效主鍵,以避免SQL注入
//按主鍵獲取
db.First(amp;user,23)
////SELECT*FROMusersWHEREid=23LIMIT1;
//簡單SQL
db.Find(amp;user,"name=","jinzhu")
////SELECT*FROMusersWHEREname="jinzhu";
db.Find(amp;users,"nameANDage","jinzhu",20)
////SELECT*FROMusersWHEREname"jinzhu"ANDage20;
//Struct
db.Find(amp;users,User{Age:20})
////SELECT*FROMusersWHEREage=20;
//Map
db.Find(amp;users,map[string]interface{}{"age":20})
////SELECT*FROMusersWHEREage=20;
2.5.Or條件查詢
db.Where("role=","admin").Or("role=","super_admin").Find(amp;users)
////SELECT*FROMusersWHERErole='admin'ORrole='super_admin';
//Struct
db.Where("name='jinzhu'").Or(User{Name:"jinzhu2"}).Find(amp;users)
////SELECT*FROMusersWHEREname='jinzhu'ORname='jinzhu2';
//Map
db.Where("name='jinzhu'").Or(map[string]interface{}{"name":"jinzhu2"}).Find(amp;users)
2.6.查詢鏈
Gorm有一個(gè)可鏈接的API,你可以這樣使用它
db.Where("name","jinzhu").Where("age=androle",20,"admin").Find(amp;users)
////SELECT*FROMusersWHEREname'jinzhu'ANDage=20ANDrole'admin';
db.Where("role=","admin").Or("role=","super_admin").Not("name=","jinzhu").Find(amp;users)
2.7.擴(kuò)展查詢選項(xiàng)
//為Select語句添加擴(kuò)展SQL選項(xiàng)
db.Set("gorm:query_option","FORUPDATE").First(amp;user,10)
////SELECT*FROMusersWHEREid=10FORUPDATE;
2.8.FirstOrInit
獲取第一個(gè)匹配的記錄,或者使用給定的條件初始化一個(gè)新的記錄(僅適用于struct,map條件)
//Unfound
db.FirstOrInit(amp;user,User{Name:"non_existing"})
////user-User{Name:"non_existing"}
//Found
db.Where(User{Name:"Jinzhu"}).FirstOrInit(amp;user)
////user-User{Id:111,Name:"Jinzhu",Age:20}
db.FirstOrInit(amp;user,map[string]interface{}{"name":"jinzhu"})
////user-User{Id:111,Name:"Jinzhu",Age:20}
2.9.Attrs
如果未找到記錄,則使用參數(shù)初始化結(jié)構(gòu)
//Unfound
db.Where(User{Name:"non_existing"}).Attrs(User{Age:20}).FirstOrInit(amp;user)
////SELECT*FROMUSERSWHEREname='non_existing';
////user-User{Name:"non_existing",Age:20}
db.Where(User{Name:"non_existing"}).Attrs("age",20).FirstOrInit(amp;user)
////SELECT*FROMUSERSWHEREname='non_existing';
////user-User{Name:"non_existing",Age:20}
//Found
db.Where(User{Name:"Jinzhu"}).Attrs(User{Age:30}).FirstOrInit(amp;user)
////SELECT*FROMUSERSWHEREname=jinzhu';
////user-User{Id:111,Name:"Jinzhu",Age:20}
2.10.Assign
將參數(shù)分配給結(jié)果,不管它是否被找到
//Unfound
db.Where(User{Name:"non_existing"}).Assign(User{Age:20}).FirstOrInit(amp;user)
////user-User{Name:"non_existing",Age:20}
//Found
db.Where(User{Name:"Jinzhu"}).Assign(User{Age:30}).FirstOrInit(amp;user)
////SELECT*FROMUSERSWHEREname=jinzhu';
////user-User{Id:111,Name:"Jinzhu",Age:30}
2.11.FirstOrCreate
獲取第一個(gè)匹配的記錄,或創(chuàng)建一個(gè)具有給定條件的新記錄(僅適用于struct,map條件)
//Unfound
db.FirstOrCreate(amp;user,User{Name:"non_existing"})
////INSERTINTO"users"(name)VALUES("non_existing");
////user-User{Id:112,Name:"non_existing"}
//Found
db.Where(User{Name:"Jinzhu"}).FirstOrCreate(amp;user)
////user-User{Id:111,Name:"Jinzhu"}
2.12.Attrs
如果未找到記錄,則為參數(shù)分配結(jié)構(gòu)
//Unfound
db.Where(User{Name:"non_existing"}).Attrs(User{Age:20}).FirstOrCreate(amp;user)
////SELECT*FROMusersWHEREname='non_existing';
////INSERTINTO"users"(name,age)VALUES("non_existing",20);
////user-User{Id:112,Name:"non_existing",Age:20}
//Found
db.Where(User{Name:"jinzhu"}).Attrs(User{Age:30}).FirstOrCreate(amp;user)
////SELECT*FROMusersWHEREname='jinzhu';
////user-User{Id:111,Name:"jinzhu",Age:20}
2.13.Assign
將其分配給記錄,而不管它是否被找到,并保存回?cái)?shù)據(jù)庫。
//Unfound
db.Where(User{Name:"non_existing"}).Assign(User{Age:20}).FirstOrCreate(amp;user)
////SELECT*FROMusersWHEREname='non_existing';
////INSERTINTO"users"(name,age)VALUES("non_existing",20);
////user-User{Id:112,Name:"non_existing",Age:20}
//Found
db.Where(User{Name:"jinzhu"}).Assign(User{Age:30}).FirstOrCreate(amp;user)
////SELECT*FROMusersWHEREname='jinzhu';
////UPDATEusersSETage=30WHEREid=111;
////user-User{Id:111,Name:"jinzhu",Age:30}
2.14.Select
指定要從數(shù)據(jù)庫檢索的字段,默認(rèn)情況下,將選擇所有字段;
db.Select("name,age").Find(amp;users)
////SELECTname,ageFROMusers;
db.Select([]string{"name","age"}).Find(amp;users)
////SELECTname,ageFROMusers;
db.Table("users").Select("COALESCE(age,)",42).Rows()
////SELECTCOALESCE(age,'42')FROMusers;
2.15.Order
在從數(shù)據(jù)庫檢索記錄時(shí)指定順序,將重排序設(shè)置為true以覆蓋定義的條件
db.Order("agedesc,name").Find(amp;users)
////SELECT*FROMusersORDERBYagedesc,name;
//Multipleorders
db.Order("agedesc").Order("name").Find(amp;users)
////SELECT*FROMusersORDERBYagedesc,name;
//ReOrder
db.Order("agedesc").Find(amp;users1).Order("age",true).Find(amp;users2)
////SELECT*FROMusersORDERBYagedesc;(users1)
////SELECT*FROMusersORDERBYage;(users2)
2.16.Limit
指定要檢索的記錄數(shù)
db.Limit(3).Find(amp;users)
////SELECT*FROMusersLIMIT3;
//Cancellimitconditionwith-1
db.Limit(10).Find(amp;users1).Limit(-1).Find(amp;users2)
////SELECT*FROMusersLIMIT10;(users1)
////SELECT*FROMusers;(users2)
2.17.Offset
指定在開始返回記錄之前要跳過的記錄數(shù)
db.Offset(3).Find(amp;users)
////SELECT*FROMusersOFFSET3;
//Canceloffsetconditionwith-1
db.Offset(10).Find(amp;users1).Offset(-1).Find(amp;users2)
////SELECT*FROMusersOFFSET10;(users1)
////SELECT*FROMusers;(users2)
eg:
typeInfostruct{
Idint`json:"id"`
Codestring`json:"code"`
HwCodestring`json:"hw_code"`
Namestring`json:"name"`
Desstring`json:"des"`
Createdint64`json:"created"`
Updatedint64`json:"updated"`
BrandIdint`json:"brand_id"`
func(Info)TableName()string{
return"bike_color"
func(oobject)QueryInfo2(idint)*Info{
r:=new(Info)
o.gDb.Where("id=",id).Find(amp;r)
returnr
//列表
func(oobject)QueryList2(page,PageSizeint)(list[]Info,totalint){
o.gDb.Offset((1)*PageSize).Limit(PageSize).Find(amp;list)
total=len(list)
return
2.18.Count
獲取模型的記錄數(shù)
db.Where("name=","jinzhu").Or("name=","jinzhu2").Find(amp;users).Count(amp;count)
////SELECT*fromUSERSWHEREname='jinzhu'ORname='jinzhu2';(users)
////SELECTcount(*)FROMusersWHEREname='jinzhu'ORname='jinzhu2';(count)
db.Model(amp;User{}).Where("name=","jinzhu").Count(amp;count)
////SELECTcount(*)FROMusersWHEREname='jinzhu';(count)
db.Table("deleted_users").Count(amp;count)
////SELECTcount(*)FROMdeleted_users;
2.19.GroupHaving
rows,err:=db.Table("orders").Select("date(created_at)asdate,sum(amount)astotal").Group("date(created_at)").Rows()
forrows.Next(){
rows,err:=db.Table("orders").Select("date(created_at)asdate,sum(amount)astotal").Group("date(created_at)").Having("sum(amount)",100).Rows()
forrows.Next(){
typeResultstruct{
Datetime.Time
Totalint64
db.Table("orders").Select("date(created_at)asdate,sum(amount)astotal").Group("date(created_at)").Having("sum(amount)",100).Scan(amp;results)
2.20.Join
指定連接條件
rows,err:=db.Table("users").Select(",emails.email").Joins("leftjoinemailsonemails.user_id=users.id").Rows()
forrows.Next(){
db.Table("users").Select(",emails.email").Joins("leftjoinemailsonemails.user_id=users.id").Scan(amp;results)
//多個(gè)連接與參數(shù)
db.Joins("JOINemailsONemails.user_id=users.idANDemails.email=","jinzhu@").Joins("JOINcredit_cardsONcredit_cards.user_id=users.id").Where("credit_cards.number=","411111111111").Find(amp;user)
2.21.Pluck
將模型中的單個(gè)列作為地圖查詢,如果要查詢多個(gè)列,可以使用Scan
varages[]int64
db.Find(amp;users).Pluck("age",amp;ages)
varnames[]string
db.Model(amp;User{}).Pluck("name",amp;names)
db.Table("deleted_users").Pluck("name",amp;names)
//要返回多個(gè)列,做這樣:
db.Select("name,age").Find(amp;users)
2.22.Scan
將結(jié)果掃描到另一個(gè)結(jié)構(gòu)中。
typeResultstruct{
Namestring
Ageint
varresultResult
db.Table("users").Select("name,age").Where("name=",3).Scan(amp;result)
//RawSQL
db.Raw("SELECTname,ageFROMusersWHEREname=",3).Scan(amp;result)
2.23.Scopes
將當(dāng)前數(shù)據(jù)庫連接傳遞到func(*DB)*DB,可以用于動(dòng)態(tài)添加條件
funcAmountGreaterThan1000(db*gorm.DB)*gorm.DB{
returndb.Where("amount",1000)
funcPaidWithCreditCard(db*gorm.DB)*gorm.DB{
returndb.Where("pay_mode_sign=","C")
funcPaidWithCod(db*gorm.DB)*gorm.DB{
returndb.Where("pay_mode_sign=","C")
funcOrderStatus(status[]string)func(db*gorm.DB)*gorm.DB{
returnfunc(db*gorm.DB)*gorm.DB{
returndb.Scopes(AmountGreaterThan1000).Where("statusin()",status)
db.Scopes(AmountGreaterThan1000,PaidWithCreditCard).Find(amp;orders)
//查找所有信用卡訂單和金額大于1000
db.Scopes(AmountGreaterThan1000,PaidWithCod).Find(amp;orders)
//查找所有COD訂單和金額大于1000
db.Scopes(OrderStatus([]string{"paid","shipped"})).Find(amp;orders)
//查找所有付費(fèi),發(fā)貨訂單
2.24.指定表名
//使用User結(jié)構(gòu)定義創(chuàng)建`deleted_users`表
db.Table("deleted_users").CreateTable(amp;User{})
vardeleted_users[]User
db.Table("deleted_users").Find(amp;deleted_users)
////SELECT*FROMdeleted_users;
db.Table("deleted_users").Where("name=","jinzhu").Delete()
////DELETEFROMdeleted_usersWHEREname='jinzhu';
3.預(yù)加載
db.Preload("Orders").Find(amp;users)
////SELECT*FROMusers;
////SELECT*FROMordersWHEREuser_idIN(1,2,3,4);
db.Preload("Orders","stateNOTIN()","cancelled").Find(amp;users)
////SELECT*FROMusers;
////SELECT*FROMordersWHEREuser_idIN(1,2,3,4)ANDstateNOTIN('cancelled');
db.Where("state=","active").Preload("Orders","stateNOTIN()","cancelled").Find(amp;users)
////SELECT*FROMusersWHEREstate='active';
////SELECT*FROMordersWHEREuser_idIN(1,2)ANDstateNOTIN('cancelled');
db.Preload("Orders").Preload("Profile").Preload("Role").Find(amp;users)
////SELECT*FROMusers;
////SELECT*FROMordersWHEREuser_idIN(1,2,3,4);//hasmany
////SELECT*FROMprofilesWHEREuser_idIN(1,2,3,4);//hasone
////SELECT*FROMrolesWHEREidIN(4,5,6);//belongsto
3.1.自定義預(yù)加載SQL
您可以通過傳遞func(db*gorm.DB)*gorm.DB(與Scopes的使用方法相同)來自定義預(yù)加載SQL,例如:
db.Preload("Orders",func(db*gorm.DB)*gorm.DB{
returndb.Order("orders.amountDESC")
}).Find(amp;users)
////SELECT*FROMusers;
////SELECT*FROMordersWHEREuser_idIN(1,2,3,4)orderbyorders.amountDESC;
3.2.嵌套預(yù)加載
db.Preload("Orders.OrderItems").Find(amp;users)
db.Preload("Orders","state=","paid").Preload("Orders.OrderItems").Find(amp;users)
4.更新
4.1.更新全部字段
Save將包括執(zhí)行更新SQL時(shí)的所有字段,即使它沒有更改
db.First(amp;user)
user.Name="jinzhu2"
user.Age=100
db.Save(amp;user)
////UPDATEusersSETname='jinzhu2',age=100,birthday='2016-01-01',updated_at='2013-11-1721:34:10'WHEREid=111;
4.2.更新更改字段
如果只想更新更改的字段,可以使用Update,Updates
//更新單個(gè)屬性(如果更改)
db.Model(amp;user).Update("name","hello")
////UPDATEusersSETname='hello',updated_at='2013-11-1721:34:10'WHEREid=111;
//使用組合條件更新單個(gè)屬性
db.Model(amp;user).Where("active=",true).Update("name","hello")
////UPDATEusersSETname='hello',updated_at='2013-11-1721:34:10'WHEREid=111ANDactive=true;
//使用`map`更新多個(gè)屬性,只會(huì)更新這些更改的字段
db.Model(amp;user).Updates(map[string]interface{}{"name":"hello","age":18,"actived":false})
////UPDATEusersSETname='hello',age=18,actived=false,updated_at='2013-11-1721:34:10'WHEREid=111;
//使用`struct`更新多個(gè)屬性,只會(huì)更新這些更改的和非空白字段
db.Model(amp;user).Updates(User{Name:"hello",Age:18})
////UPDATEusersSETname='hello',age=18,updated_at='2013-11-1721:34:10'WHEREid=111;
//警告:當(dāng)使用struct更新時(shí),F(xiàn)ORM將僅更新具有非空值的字段
//對(duì)于下面的更新,什么都不會(huì)更新為"",0,false是其類型的空白值
db.Model(amp;user).Updates(User{Name:"",Age:0,Actived:false})
4.3.更新選擇的字段
如果您只想在更新時(shí)更新或忽略某些字段,可以使用Select,Omit
db.Model(amp;user).Select("name").Updates(map[string]interface{}{"name":"hello","age":18,"actived":false})
////UPDATEusersSETname='hello',updated_at='2013-11-1721:34:10'WHEREid=111;
db.Model(amp;user).Omit("name").Updates(map[string]interface{}{"name":"hello","age":18,"actived":false})
////UPDATEusersSETage=18,actived=false,updated_at='2013-11-1721:34:10'WHEREid=111;
4.4.更新更改字段但不進(jìn)行Callbacks
以上更新操作將執(zhí)行模型的BeforeUpdate,AfterUpdate方法,更新其UpdatedAt時(shí)間戳,在更新時(shí)保存它的Associations,如果不想調(diào)用它們,可以使用UpdateColumn,UpdateColumns
//更新單個(gè)屬性,類似于`Update`
db.Model(amp;user).UpdateColumn("name","hello")
////UPDATEusersSETname='hello'WHEREid=111;
//更新多個(gè)屬性,與“更新”類似
db.Model(amp;user).UpdateColumns(User{Name:"hello",Age:18})
////UPDATEusersSETname='hello',age=18WHEREid=111;
4.5.BatchUpdates批量更新
Callbacks在批量更新時(shí)不會(huì)運(yùn)行
db.Table("users").Where("idIN()",[]int{10,11}).Updates(map[string]interface{}{"name":"hello","age":18})
////UPDATEusersSETname='hello',age=18WHEREidIN(10,11);
//使用struct更新僅適用于非零值,或使用map[string]interface{}
db.Model(User{}).Updates(User{Name:"hello",Age:18})
////UPDATEusersSETname='hello',age=18;
//使用`RowsAffected`獲取更新記錄計(jì)數(shù)
db.Model(User{}).Updates(User{Name:"hello",Age:18}).RowsAffected
4.6.使用SQL表達(dá)式更新
DB.Model(amp;product).Update("price",gorm.Expr("price*+",2,100))
////UPDATE"products"SET"price"=price*'2'+'100',"updated_at"='2013-11-1721:34:10'WHERE"id"='2';
DB.Model(amp;product).Updates(map[string]interface{}{"price":gorm.Expr("price*+",2,100)})
////UPDATE"products"SET"price"=price*'2'+'100',"updated_at"='2013-11-1721:34:10'WHERE"id"='2';
DB.Model(amp;product).UpdateColumn("quantity",gorm.Expr("quantity-",1))
////UPDATE"products"SET"quantity"=quantity-1WHERE"id"='2';
DB.Model(amp;product).Where("quantity1").UpdateColumn("quantity",gorm.Expr("quantity-",1))
////UPDATE"products"SET"quantity"=quantity-1WHERE"id"='2'ANDquantity1;
4.7.在Callbacks中更改更新值
如果要使用BeforeUpdate,BeforeSave更改回調(diào)中的更新值,可以使用scope.SetColumn,例如
func(user*User)BeforeSave(scope*gorm.Scope)(errerror){
ifpw,err:=bcrypt.GenerateFromPassword(user.Password,0);err==nil{
scope.SetColumn("EncryptedPassword",pw)
4.8.額外更新選項(xiàng)
//為Update語句添加額外的SQL選項(xiàng)
db.Model(amp;user).Set("gorm:update_option","OPTION(OPTIMIZEFORUNKNOWN)").Update("name,"hello")
////UPDATEusersSETname='hello',updated_at='2013-11-1721:34:10'WHEREid=111OPTION(OPTIMIZEFORUNKNOWN);
5.刪除/軟刪除
警告刪除記錄時(shí),需要確保其主要字段具有值,GORM將使用主鍵刪除記錄,如果主要字段為空,GORM將刪除模型的所有記錄
//刪除存在的記錄
db.Delete(amp;email)
////DELETEfromemailswhereid=10;
//為Delete語句添加額外的SQL選項(xiàng)
db.Set("gorm:delete_option","OPTION(OPTIMIZEFORUNKNOWN)").Delete(amp;email)
////DELETEfromemailswhereid=10OPTION(OPTIMIZEFORUNKNOWN);
5.1.批量刪除
刪除所有匹配記錄
db.Where("emailLIKE","%jinzhu%").Delete(Email{})
////DELETEfromemailswhereemailLIKE"%jinhu%";
db.Delete(Email{},"emailLIKE","%jinzhu%")
////DELETEfromemailswhereemailLIKE"%jinhu%";
5.2.軟刪除
如果模型有DeletedAt字段,它將自動(dòng)獲得軟刪除功能!那么在調(diào)用Delete時(shí)不會(huì)從數(shù)據(jù)庫中永久刪除,而是只將字段DeletedAt的值設(shè)置為當(dāng)前時(shí)間。
db.Delete(amp;user)
////UPDATEusersSETdeleted_at="2013-10-2910:23"WHEREid=111;
//批量刪除
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 古代書畫考試題及答案
- 2025年瓦匠培訓(xùn)考試試題及答案
- 2025年高考物理“系統(tǒng)思維”構(gòu)建試題
- 教育有關(guān)的考試題及答案
- 工序知識(shí)考試題及答案解析
- 市場調(diào)查分析框架及數(shù)據(jù)應(yīng)用
- 高等代數(shù)1考試題及答案
- 贛源食品考試題及答案
- 2025年丙肝防止培訓(xùn)試題及答案
- 玉泉學(xué)??荚囶}目及答案
- 金華蘭溪市衛(wèi)生健康局所屬事業(yè)單位招聘筆試真題2024
- 旅游政策與法規(guī)基礎(chǔ)教程
- 風(fēng)電項(xiàng)目運(yùn)營與維護(hù)管理方案
- 學(xué)習(xí)《水利水電工程生產(chǎn)安全重大事故隱患判定導(dǎo)則-SLT 842》課件
- 2025年秋招:招商銀行筆試真題及答案(可下載)
- 1.3 逐層分類細(xì)化分類結(jié)果【知識(shí)精研】二年級(jí)上冊(cè)數(shù)學(xué)(人教版2024)
- 甘肅省醫(yī)療建設(shè)管理辦法
- 計(jì)算機(jī)視覺(CV)工程師崗位面試問題及答案
- 胸痛的護(hù)理教學(xué)課件
- 2025年輔警招聘考試題庫(+答案解析)
- 橋梁施工培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論