欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
聊聊gorm的OnConflict

OnConflict

clause/on_conflict.go

type OnConflict struct {

Columns      []Column

Where        Where

OnConstraint string

DoNothing    bool

DoUpdates    Set

UpdateAll    bool

}

func (OnConflict) Name() string {

return "ON CONFLICT"

}

// Build build onConflict clausefunc (onConflict OnConflict) Build(builder Builder) {

if len(onConflict.Columns) > 0 {

builder.WriteByte('(')

for idx, column := range onConflict.Columns {

if idx > 0 {

builder.WriteByte(',')

}

builder.WriteQuoted(column)

}

builder.WriteString(`) `)

}

if len(onConflict.Where.Exprs) > 0 {

builder.網(wǎng)站監控WriteString("WHERE ")

onConflict.Where.Build(builder)

builder.WriteByte(' ')

}

if onConflict.OnConstraint != "" {

builder.WriteString("ON CONSTRAINT ")

builder.WriteString(onConflict.OnConstraint)

builder.WriteByte(' ')

}

if onConflict.DoNothing {

builder.WriteString("DO NOTHING")

} else {

builder.WriteString("DO UPDATE SET ")

onConflict.DoUpdates.Build(builder)

}

}

// MergeClause merge onConflict clausesfunc (onConflict OnConflict) MergeClause(clause *Clause) {

clause.Expression = onConflict

}

OnConflict定義了Columns、Where、OnConstraint、DoNothing、DoUpdates、UpdateAll屬性;Build方法會(huì )根據這些屬性拼裝sql,如果是DoNothing則追加DO NOTHING,否則追加DO UPDATE SET

Expression

clause/set.go

type Set []Assignment

type Assignment struct {

Column Column

Value  interface{}

}

func (set Set) Name() string {

return "SET"

}

func (set Set) Build(builder Builder) {

if len(set) > 0 {

for idx, assignment := range set {

if idx > 0 {

builder.WriteByte(',')

}

builder.WriteQuoted(assignment.Column)

builder.WriteByte('=')

builder.AddVar(builder, assignment.Value)

}

} else {

builder.WriteQuoted(PrimaryColumn)

builder.WriteByte('=')

builder.WriteQuoted(PrimaryColumn)

}

}

// MergeClause merge assignments clauses

func (set Set) MergeClause(clause *Clause) {

copiedAssignments := make([]Assignment, len(set))

copy(copiedAssignments, set)

clause.Expression = Set(copiedAssignments)

}

func Assignments(values map[string]interface{}) Set {

keys := make([]string, 0, len(values))

for key := range values {

keys = append(keys, key)

}

sort.Strings(keys)

assignments := make([]Assignment, len(keys))

for idx, key := range keys {

assignments[idx] = Assignment{Column: Column{Name: key}, Value: values[key]}

}

return assignments

}

func AssignmentColumns(values []string) Set {

assignments := make([]Assignment, len(values))

for idx, value := range values {

assignments[idx] = Assignment{Column: Column{Name: value}, Value: Column{Table: "excluded", Name: value}}

}

return assignments

}

DoUpdates屬性是Set類(lèi)型,Set類(lèi)型實(shí)際是Assignment數組;其Build方法會(huì )組裝assignment的sql

實(shí)例

func onConflictDemo(db *gorm.DB) {

entities := []DemoEntity{

{

Model: gorm.Model{ID: 1},

Name:  "coco",

},

{

Model: gorm.Model{ID: 2},

Name:  "bear",

},

}

result := db.Debug().Create(&entities)

b, _ := json.Marshal(entities)

log.Println("data:", string(b))

log.Println("result.RowsAffected:", result.RowsAffected, "result.Error:", result.Error)

if err := db.Debug().Clauses(clause.OnConflict{DoNothing: true}).Create(&entities).Error; err != nil {

panic(err)

}

}

輸出

2021/01/17 20:03:31 /demo.go:53 UNIQUE constraint failed: demo_entities.id

[0.487ms] [rows:0] INSERT INTO `demo_entities` (`created_at`,`updated_at`,`deleted_at`,`name`,`id`) VALUES ("2021-01-17 20:03:31.711","2021-01-17 20:03:31.711",NULL,"coco",1),("2021-01-17 20:03:31.711","2021-01-17 20:03:31.711",NULL,"bear",2)2021/01/17 20:03:31 data: [{"ID":1,"CreatedAt":"2021-01-17T20:03:31.71143+08:00","UpdatedAt":"2021-01-17T20:03:31.71143+08:00","DeletedAt":null,"Name":"coco"},{"ID":2,"CreatedAt":"2021-01-17T20:03:31.71143+08:00","UpdatedAt":"2021-01-17T20:03:31.71143+08:00","DeletedAt":null,"Name":"bear"}]2021/01/17 20:03:31 result.RowsAffected: 0 result.Error: UNIQUE constraint failed: demo_entities.id

2021/01/17 20:03:31 /demo.go:58

[0.123ms] [rows:0] INSERT INTO `demo_entities` (`created_at`,`updated_at`,`deleted_at`,`name`,`id`) VALUES ("2021-01-17 20:03:31.711","2021-01-17 20:03:31.711",NULL,"coco",1),("2021-01-17 20:03:31.711","2021-01-17 20:03:31.711",NULL,"bear",2) ON CONFLICT DO NOTHING

小結

gorm的OnConflict定義了Columns、Where、OnConstraint、DoNothing、DoUpdates、UpdateAll屬性;Build方法會(huì )根據這些屬性拼裝sql,如果是DoNothing則追加DO NOTHING,否則追加DO UPDATE SET。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
[Err] 1055
簡(jiǎn)單點(diǎn),理解iOS與函數式編程
C#高級
從零開(kāi)始使用Go快速寫(xiě)出一個(gè)Web后端,使用Gin gorm Mysql做一個(gè)合格CURD程序員
效率提高80%,Go開(kāi)發(fā)必備的庫與工具
使用 Casbin 在 Golang 項目中授權
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久