专栏名称: go4it
目录
相关文章推荐
知产力  ·  论马库什权利要求在专利无效程序中的修改 ·  7 小时前  
知产力  ·  论马库什权利要求在专利无效程序中的修改 ·  7 小时前  
哈佛商业评论  ·  奢侈品全渠道销售困局,如何破解? ·  20 小时前  
21世纪商业评论  ·  360亿深圳芯片龙头,总裁出走 ·  昨天  
商业洞察  ·  华为,到账115亿 ·  4 天前  
51好读  ›  专栏  ›  go4it

聊聊gorm的OnConflict

go4it  · 掘金  ·  · 2021-01-17 20:55

正文

阅读 48

聊聊gorm的OnConflict

本文主要研究一下gorm的OnConflict

OnConflict

gorm.io/[email protected]/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 clause
func (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.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 clauses
func (onConflict OnConflict) MergeClause(clause *Clause) {
	clause.Expression = onConflict
}
复制代码






请到「今天看啥」查看全文