go MySQL批量_使用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。编程水平有待提高。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值