package main
import (
"database/sql"
"flag"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
"regexp"
"strconv"
"time"
)
var limit int // 设置limit
var name string
var password string
type Volume struct { // 搜索对象的结构体
VolumeID int // SL中的volumeID
Index string // 奇葩索引
}
func init() {
flag.IntVar(&limit, "limit", 0, "执行行数,如果为空则默认全部")
flag.StringVar(&name, "u", "root", "数据库用户名(默认root")
flag.StringVar(&password, "p", "", "数据库密码")
}
func main() {
start := time.Now() // 记时
flag.Parse() // 解析输入参数
sv := &Volume{}
// 连接数据库
sl, err := sql.Open("mysql", name+":"+password+"@/xxx?charset=utf8")
an, err := sql.Open("mysql", name+":"+password+"@/yyy?charset=utf8")
if err != nil {
log.Fatal(err)
}
// 构造SELECT语句并检索
queryStr := "SELECT VolumeID, `Index` FROM volume "
if limit > 0 {
queryStr += "limit " + strconv.Itoa(limit)
}
rows, err := sl.Query(queryStr)
if err != nil {
log.Fatal(err)
}
// 对取到的每一行数据进行操作
for rows.Next() {
// sv赋值
if err := rows.Scan(&sv.VolumeID, &sv.Index); err != nil {
log.Fatal(err)
}
// 构造更新语句
stmt, err := an.Prepare("UPDATE novel_volume a SET a.sort=? WHERE volumeID = ?")
if err != nil {
log.Fatal(err)
}
// 开始正则解析
if result := regexp.MustCompile("^\\d+(\\.\\d+)?$").MatchString(sv.Index); result {
// 如果全是数字,则对原数字乘10
num, err := strconv.ParseFloat(sv.Index, 64)
if err != nil {
fmt.Println("Problem1: " + sv.Index)
log.Fatal(err)
}
// 执行update
if _, err := stmt.Exec(int(num*10), sv.VolumeID); err != nil {
log.Fatal(err)
}
// 释放连接
stmt.Close()
} else if result := regexp.MustCompile("\\d+(\\.\\d+)?").FindString(sv.Index); result != "" {
// 如果是字符数字混合,则200+10x
num, err := strconv.ParseFloat(result, 64)
if err != nil {
fmt.Printf("Problem2:" + result)
log.Fatal(err)
}
if _, err := stmt.Exec(int(200+num*10), sv.VolumeID); err != nil {
log.Fatal(err)
}
stmt.Close()
} else {
// 全字符,400+10x
if _, err := stmt.Exec(400, sv.VolumeID); err != nil {
log.Fatal(err)
}
stmt.Close()
}
}
end := time.Now()
fmt.Println(end.Sub(start))
}
对4.5k行数据的操作,用了2m。编程水平有待提高。。