golanggorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例_第1頁
golanggorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例_第2頁
golanggorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例_第3頁
golanggorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例_第4頁
golanggorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論