国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

golang 數據庫批量更新工具備份

2020-04-01 19:11:35
字體:
來源:轉載
供稿:網友

使用golang多線程批量更新數據數據。

共4個文件

main.go

  1. package main 
  2.  
  3. import ( 
  4.     "bufio" 
  5.     "fmt" 
  6.     _ "github.com/go-sql-driver/mysql" 
  7.     "os" 
  8.     . "pt" 
  9.  
  10. func main() { 
  11.     args := os.Args 
  12.     if len(args) == 2 { 
  13.         switch args[1] { 
  14.         case "1"
  15.             Cu.Run() 
  16.         case "2"
  17.             //平臺負債表數據靜態化 
  18.             Fz.Run() 
  19.         case "0"
  20.             os.Exit(0) 
  21.         default
  22.         } 
  23.     } 
  24.     if len(args) == 1 { 
  25.         for { 
  26.             fmt.Println("操作目錄: "
  27.             fmt.Println("1、平臺有效客戶更新(202:13306-platform)。 "
  28.             fmt.Println("2、平臺負債數據靜態化(202:13306-platform)。"
  29.             fmt.Println("0、退出。 "
  30.             inputReader := bufio.NewReader(os.Stdin) 
  31.             command, _, _ := inputReader.ReadLine() 
  32.             code := string(command) 
  33.             switch code { 
  34.             case "1"
  35.                 Cu.Run() 
  36.             case "2"
  37.                 //平臺負債表數據靜態化 
  38.                 Fz.Run() 
  39.             case "0"
  40.                 os.Exit(0) 
  41.             default
  42.                 fmt.Println("default"
  43.             } 
  44.             fmt.Println("-------處理完成-------"
  45.         } 
  46.     } 
  47.  

pt/custatus.go

// 客戶屬性自動更新封裝

// 需要公司開啟自動更新并配置客戶過期周期時間

package pt

import (

"fmt"

"log"

"strconv"

"strings"

"time"

)

type CuStatusClass struct {

}

func NewCu() *CuStatusClass {

obj := new(CuStatusClass)

return obj

}

/**

*判斷客戶狀態

**/

func (obj *CuStatusClass) getState(orders int, practs int, state int) int {

if orders > 0 || practs > 0 {

return 1 //最近有訂單OR有實操 為有效客戶

}

if state == 3 {

return 3 //死檔客戶

}

if state == -1 {

return -1 //無效客戶

}

//默認返回為久黨客戶

return 2

}

/*

* 獲取公司關于有效客戶的配置天數 默認30天

*/

func (obj *CuStatusClass) getConfig(str string) int {

var num int

n := strings.Index(str, "member_config")

if n == -1 {

num = 30

} else {

start := n + 20

end := n + 22

num2 := string([]byte(str)[start:end])

num, _ = strconv.Atoi(num2)

}

return num

}

/**

* 更新一個公司的客戶狀態 (PT) 考慮新建數據庫連接 提高效率

* @param {[type]} db *sql.DB [description]

* @param {[type]} c chan int [description]

* @param {[type]} comp_id int [公司ID]

* @param {[type]} num int [有效期天數]

* @return {[type]} [description]

*/

func (obj *CuStatusClass) updateOneComp(c chan string, comp_id int, num int) {

db := Mydb()

defer db.Close()

end := time.Now().Unix()

start := end - 3600*24*int64(num) //前推num天

sql := "SELECT a.id,a.name,a.status,(SELECT COUNT(*) FROM `order_sale` WHERE `cu_id` = a.id AND `pay_time` > ? AND `pay_time` < ? AND `type` IN (1,2)) AS orders, (SELECT COUNT(*) FROM `practice_order` WHERE `cu_id` = a.id AND `pay_time` > ? AND `pay_time` < ?) AS practs FROM `customer_info` AS a LEFT JOIN `config_membership` AS m ON a.membership_id = m.id WHERE m.`is_member` = 1 AND a.`company_id` = ?"

rows, err := db.Query(sql, start, end, start, end, comp_id)

if err != nil {

log.Println(err)

}

defer rows.Close()

var id int

var orders int

var practs int

var name string

var status int

for rows.Next() {

err := rows.Scan(&id, &name, &status, &orders, &practs)

if err != nil {

log.Fatal(err)

}

new_status := obj.getState(orders, practs, status)

if status != new_status {

stmt, err := db.Prepare("UPDATE `customer_info` SET `status`=? WHERE `id`=?")

defer stmt.Close()

if err != nil {

log.Println(err)

return

}

stmt.Exec(new_status, id)

//返回管道信息寫入

c <- fmt.Sprintf("%d", comp_id) + ":" + fmt.Sprintf("%d", id) + " " + name + " " + fmt.Sprintf("%d", status) + "->" + fmt.Sprintf("%d", new_status)

}

}

err = rows.Err()

if err != nil {

log.Fatal(err)

}

close(c)

}

/**

* 多公司并發處理 (PT)

* @param {[type]} db *sql.DB [description]

* @return {[type]} [description]

*/

func (obj *CuStatusClass) Run() {

db := Mydb()

defer db.Close()

sql := "SELECT id , auto_cu_status, config FROM `company_info` WHERE `status` = 1"

rows, err := db.Query(sql)

if err != nil {

log.Println(err)

}

defer rows.Close()

chs := make([]chan string, 0) //開多個管道接受消息

var id int

var auto int

var config string

for rows.Next() {

err := rows.Scan(&id, &auto, &config)

if err != nil {

log.Fatal(err)

}

if auto == 1 {

num := obj.getConfig(config) //客戶有效期設置

c := make(chan string)

chs = append(chs, c)

go obj.updateOneComp(c, id, num)

}

}

err = rows.Err()

if err != nil {

log.Fatal(err)

}

for _, ch := range chs { //多管道寫法

for {

x, ok := <-ch

if ok == false {

break

}

writeResult("cu_status", x)

fmt.Println(x) //消息回收處理 可擴展寫入文件日志

}

}

}

var Cu *CuStatusClass

func init() {

Cu = NewCu()

}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莱西市| 靖江市| 厦门市| 马公市| 安西县| 东莞市| 余江县| 晋城| 岐山县| 汨罗市| 苏尼特右旗| 正安县| 河南省| 深泽县| 渝北区| 普安县| 安溪县| 霍山县| 白山市| 会同县| 清远市| 五台县| 玛多县| 宣汉县| 苍山县| 蓬安县| 晋城| 宁海县| 中卫市| 郑州市| 绥芬河市| 鸡西市| 江西省| 武隆县| 阿拉善盟| 舟山市| 色达县| 小金县| 泸溪县| 习水县| 进贤县|