-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
process.go
86 lines (76 loc) · 1.84 KB
/
process.go
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
80
81
82
83
84
85
86
package data_migrate
import (
"database/sql"
"fmt"
"strings"
)
func InsertRowFunc(insertStmt *sql.Stmt, to *TableContext) ProcessRowFunc {
return func(row *Row) error {
var err error
if insertStmt == nil {
insertColumns := make([]string, len(row.Columns))
for k, c := range row.Columns {
insertColumns[k] = c.Column
}
insertStmt, err = to.DB.Prepare(fmt.Sprintf(
"INSERT INTO `%s`.`%s` (%s) VALUES(%s)",
to.DBName,
to.Table,
strings.Join(insertColumns, ", "),
strings.TrimSuffix(strings.Repeat("?, ", len(insertColumns)), ", "),
))
if err != nil {
return err
}
}
binds := make([]interface{}, len(row.Columns))
for k, v := range row.Columns {
binds[k] = v.Value
}
_, err = insertStmt.Exec(binds...)
if err != nil {
return err
}
return nil
}
}
func UpsertRowFunc(upsertStmt *sql.Stmt, to *TableContext) ProcessRowFunc {
return func(row *Row) error {
var err error
colCount := len(row.Columns)
if upsertStmt == nil {
insertColumns := make([]string, colCount)
upsertColumns := make([]string, colCount)
for k, c := range row.Columns {
insertColumns[k] = c.Column
upsertColumns[k] = c.Column + " = ?"
}
upsertSQL := fmt.Sprintf(
"INSERT INTO `%s`.`%s` (%s) VALUES(%s) ON DUPLICATE KEY UPDATE %s",
to.DBName,
to.Table,
strings.Join(insertColumns, ", "),
strings.TrimSuffix(strings.Repeat("?, ", len(insertColumns)), ", "),
strings.Join(upsertColumns, ", "),
)
upsertStmt, err = to.DB.Prepare(upsertSQL)
if err != nil {
return err
}
}
binds := make([]interface{}, colCount*2)
// insert binds
for k, v := range row.Columns {
binds[k] = v.Value
}
// upsert binds
for k, v := range row.Columns {
binds[colCount+k] = v.Value
}
_, err = upsertStmt.Exec(binds...)
if err != nil {
return err
}
return nil
}
}