4 Star 15 Fork 11

北京小程科技有限公司 / 数据库批量同步工具

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
update_mysql.go 1.95 KB
一键复制 编辑 原始数据 按行查看 历史
package dbsync
import (
"fmt"
"strings"
)
// 通用插入数据
func updateMySQL(
db SQLCommon,
tableName string,
data [][]interface{},
options UpdateOptions,
) (err error) {
// 列名和索引的映射关系
mapItem := make(map[string]int)
for i, fieldName := range options.Columns {
mapItem[fieldName] = i
}
i, columnsLen := 0, len(options.Columns)
for k := range options.FixedFields {
mapItem[k] = columnsLen + i
i++
}
mapItemLen := len(mapItem)
// 生成唯一键或主键的判断映射
uniqueMap := make(map[string]bool)
for _, k := range options.UniqueFields {
uniqueMap[k] = true
}
// 生成时间列的判断映射
timeMap := make(map[string]bool)
for _, k := range options.TimeFields {
timeMap[k] = true
}
// 生成SQL语句的列名、问号、值列表
columns := make([]string, mapItemLen)
updateColumns := make([]string, 0)
questions := make([]string, mapItemLen)
for k, num := range mapItem {
columns[num] = k
if uniqueMap[k] != true {
updateColumns = append(updateColumns, fmt.Sprintf("%s=VALUES(%s)", k, k))
}
questions[num] = "?"
}
colStr, questionStr, updateStr := strings.Join(columns, ","), fmt.Sprintf("(%s)", strings.Join(questions, ",")), strings.Join(updateColumns, ",")
dataLen := len(data)
values := make([]interface{}, mapItemLen*dataLen)
allQuestions := make([]string, dataLen)
for k, dataItem := range data {
for fieldName, num := range mapItem {
index := mapItemLen*k + num
if num >= columnsLen {
values[index] = options.FixedFields[fieldName]
} else {
if timeMap[fieldName] == true {
values[index] = convertTimeType(dataItem[num])
} else {
values[index] = dataItem[num]
}
}
}
allQuestions[k] = questionStr
}
allQuestionStr := strings.Join(allQuestions, ",")
// 生成并执行SQL语句
sqlStr := fmt.Sprintf("INSERT INTO %s (%s) VALUES %s ON DUPLICATE KEY UPDATE %s",
tableName, colStr, allQuestionStr, updateStr)
_, err = db.Exec(sqlStr, values...)
return
}
Go
1
https://gitee.com/xiaochengtech/dbsync.git
git@gitee.com:xiaochengtech/dbsync.git
xiaochengtech
dbsync
数据库批量同步工具
master

搜索帮助