代码拉取完成,页面将自动刷新
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
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。