使用Go对数据库批量更新

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。编程水平有待提高。。



你可能感兴趣的:(mysql,Go,golang)