-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquery_update.go
More file actions
79 lines (70 loc) · 1.94 KB
/
Copy pathquery_update.go
File metadata and controls
79 lines (70 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package query
import "github.com/epkgs/query/clause"
// UpdateQuery 是 UPDATE 查询结构体。
// 包含表名、更新字段值、WHERE 条件和分页参数,
// 通过 Build 方法将完整的 UPDATE 语句写入 Builder。
type UpdateQuery struct {
table string
errorRecord
*where[*UpdateQuery]
*pagination[*UpdateQuery]
values map[string]interface{}
}
// Update 设置UPDATE查询的字段值
// 支持两种调用方式:
// 1. Update("field", value) - 设置单个字段值
// 2. Update(map[string]interface{}) - 设置多个字段值
func (q *UpdateQuery) Update(column interface{}, value ...interface{}) *UpdateQuery {
switch v := column.(type) {
case string:
// Set("field", value) 形式
if len(value) > 0 {
q.values[v] = value[0]
}
case map[string]interface{}:
// Set(map[string]interface{}) 形式
for k, val := range v {
q.values[k] = val
}
}
return q
}
// Build 构建UPDATE查询的SQL语句
func (q *UpdateQuery) Build(builder clause.Builder) {
// 构建 UPDATE 部分
builder.WriteString("UPDATE ")
builder.WriteQuoted(q.table)
// 构建 SET 部分
if len(q.values) > 0 {
builder.WriteString(" SET ")
// 对字段进行排序,确保生成的SQL有固定的字段顺序
var fields []string
for field := range q.values {
fields = append(fields, field)
}
// 简单排序(按字典序)
for i := 0; i < len(fields)-1; i++ {
for j := i + 1; j < len(fields); j++ {
if fields[i] > fields[j] {
fields[i], fields[j] = fields[j], fields[i]
}
}
}
// 构建SET子句
for i, field := range fields {
if i > 0 {
builder.WriteString(", ")
}
builder.WriteQuoted(field)
builder.WriteString(" = ")
builder.AddVar(builder, q.values[field])
}
}
// 构建 WHERE 部分
q.where.Build(builder)
// 构建分页部分
if q.pagination.Value.Limit != nil && *q.pagination.Value.Limit > 0 {
builder.WriteString(" LIMIT ")
builder.AddVar(builder, *q.pagination.Value.Limit)
}
}