From d9ef311c5d97dbb8e0485db10fd93f8683bdf5f8 Mon Sep 17 00:00:00 2001 From: KAiTO <929654790@qq.com> Date: Sun, 6 Aug 2023 17:36:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9md=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Backup_module/Backup.go | 34 ++++++-- Export_module/Export_sql.go | 162 ++++++++++++++++++++++++++++++++++++ 2 files changed, 187 insertions(+), 9 deletions(-) create mode 100644 Export_module/Export_sql.go diff --git a/Backup_module/Backup.go b/Backup_module/Backup.go index 322d690..34de32f 100644 --- a/Backup_module/Backup.go +++ b/Backup_module/Backup.go @@ -6,11 +6,11 @@ import ( "os/exec" "time" + "github.com/chzyer/readline" "github.com/gookit/color" ) var ( - mode int // color Green = color.Green.Render Red = color.Red.Render @@ -19,11 +19,19 @@ var ( func Backup() { fmt.Println("欢迎使用DBA_TOOLBOX的备份功能") - fmt.Print("请输入备份模式:[1,全库全表备份]、[2,除去系统表备份]、[3,指定库备份]>") - fmt.Scanln(&mode) + rl, err := readline.New("请输入备份模式:[1,全库全表备份]、[2,除去系统表备份]、[3,指定库备份]> ") + if err != nil { + panic(err) + } + defer rl.Close() + + mode, err := rl.Readline() + if err != nil { + panic(err) + } switch mode { - case 1: + case "1": fileName := fmt.Sprintf("All_DB_%s.sql", time.Now().Format("20060102_150405")) // 备份命令 cmd := exec.Command("mysqldump", "-u"+Global.User, "-p"+Global.Password, "-A", "--result-file="+fileName) @@ -34,7 +42,7 @@ func Backup() { return } color.BgGreen.Println("备份全库全表成功:") - case 2: + case "2": rows, err := Global.DB.Query("SHOW DATABASES") if err != nil { fmt.Println("查询数据库列表失败:", err) @@ -61,11 +69,19 @@ func Backup() { go backup(dbName) time.Sleep(time.Second) } - case 3: + case "3": for { - var Appoint_dbName string - fmt.Print("请输入要备份的库名,输入结束请输入 0 \n") - fmt.Scanln(&Appoint_dbName) + + r2, err := readline.New("请输入要备份的库名,输入结束请输入 0> ") + if err != nil { + panic(err) + } + defer r2.Close() + + Appoint_dbName, err := r2.Readline() + if err != nil { + panic(err) + } if Appoint_dbName == "0" { break } diff --git a/Export_module/Export_sql.go b/Export_module/Export_sql.go new file mode 100644 index 0000000..851e7db --- /dev/null +++ b/Export_module/Export_sql.go @@ -0,0 +1,162 @@ +package Export_module + +func main() { + +} + +// import "fmt" + +// func Export_sql() { +// db, err := connectDB() +// if err != nil { +// fmt.Println("连接数据库失败:", err) +// return +// } +// defer db.Close() + +// tableName := "test" // 要导出的表名 +// concurrency := 10 // 并发协程数,可以根据实际情况调整 + +// err = exportTableToSQL(db, tableName, concurrency) +// if err != nil { +// fmt.Println("导出数据失败:", err) +// return +// } +// } + +// func getTableStructure(db *sql.DB, tableName string) (string, error) { +// var structure string +// query := fmt.Sprintf("SHOW CREATE TABLE %s", tableName) +// err := db.QueryRow(query).Scan(&tableName, &structure) +// if err != nil { +// return "", err +// } +// return structure, nil +// } +// func getTableData(db *sql.DB, tableName string, start, end int) ([]string, error) { +// var rows []string + +// query := fmt.Sprintf("SELECT * FROM %s LIMIT %d, %d", tableName, start, end) +// result, err := db.Query(query) +// if err != nil { +// return rows, err +// } +// defer result.Close() + +// columns, err := result.Columns() +// if err != nil { +// return rows, err +// } + +// values := make([]interface{}, len(columns)) +// scanArgs := make([]interface{}, len(columns)) +// for i := range values { +// scanArgs[i] = &values[i] +// } + +// for result.Next() { +// if err := result.Scan(scanArgs...); err != nil { +// return rows, err +// } + +// var rowValues []string +// for _, value := range values { +// if value == nil { +// rowValues = append(rowValues, "NULL") +// } else { +// rowValues = append(rowValues, fmt.Sprintf("'%v'", value)) +// } +// } +// rows = append(rows, "("+strings.Join(rowValues, ", ")+")") +// } + +// return rows, nil +// } +// func exportToSQLFile(tableName, tableStructure string, tableData []string) error { +// fileName := tableName + ".sql" +// file, err := os.Create(fileName) +// if err != nil { +// return err +// } +// defer file.Close() + +// _, err = file.WriteString(tableStructure + ";\n\n") +// if err != nil { +// return err +// } + +// _, err = file.WriteString("INSERT INTO " + tableName + " VALUES\n") +// if err != nil { +// return err +// } + +// for i, row := range tableData { +// _, err := file.WriteString(row) +// if err != nil { +// return err +// } + +// if i != len(tableData)-1 { +// _, err = file.WriteString(",\n") +// if err != nil { +// return err +// } +// } +// } + +// _, err = file.WriteString(";\n") +// if err != nil { +// return err +// } + +// fmt.Println("导出成功,文件名为:", fileName) +// return nil +// } +// func exportTableToSQL(db *sql.DB, tableName string, concurrency int) error { +// tableStructure, err := getTableStructure(db, tableName) +// if err != nil { +// return err +// } + +// totalRows, err := getTotalRowCount(db, tableName) +// if err != nil { +// return err +// } + +// rowsPerRoutine := totalRows / concurrency +// remainder := totalRows % concurrency + +// var wg sync.WaitGroup +// wg.Add(concurrency) + +// var tableData []string + +// for i := 0; i < concurrency; i++ { +// startRow := i * rowsPerRoutine +// endRow := (i + 1) * rowsPerRoutine +// if i == concurrency-1 { +// endRow += remainder +// } + +// go func(start, end int) { +// defer wg.Done() + +// data, err := getTableData(db, tableName, start, end) +// if err != nil { +// fmt.Println(err) +// return +// } + +// tableData = append(tableData, data...) +// }(startRow, endRow) +// } + +// wg.Wait() + +// err = exportToSQLFile(tableName, tableStructure, tableData) +// if err != nil { +// return err +// } + +// return nil +// } -- Gitee