|
|
|
package main
|
|
|
|
|
|
|
|
/*
|
|
|
|
思路:
|
|
|
|
实现 a (a a0101,b,c,d a0184) 现在只针对 a0184 生效,并且可以实现导出照片信息
|
|
|
|
|
|
|
|
*/
|
|
|
|
import (
|
|
|
|
"archive/zip"
|
|
|
|
"database/sql"
|
|
|
|
"golang.org/x/sys/windows/registry"
|
|
|
|
"io"
|
|
|
|
"log"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
|
|
)
|
|
|
|
|
|
|
|
//存在所有对象信息 - 集合
|
|
|
|
func main() {
|
|
|
|
sqlPath := "./hy_qggwy_kk.sql"
|
|
|
|
|
|
|
|
db, _ := sql.Open("mysql", "root:admin@tcp(127.0.0.1:35017)/hy_qggwy?charset=utf8")
|
|
|
|
log.Print("操作数据库连接:", db)
|
|
|
|
|
|
|
|
// 创建临时文件夹
|
|
|
|
dir := time.Now().Format("2006102150405")
|
|
|
|
if err := os.Mkdir("./"+dir, os.ModePerm); err != nil {
|
|
|
|
log.Fatal("创建目录时发生异常:", db)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 获取MySQL的安装目录
|
|
|
|
// getMySQLPathByRegistry()
|
|
|
|
mysqlPath := getMySQLPath(db)
|
|
|
|
|
|
|
|
// 插入预置脚本
|
|
|
|
runSQL(mysqlPath, sqlPath)
|
|
|
|
|
|
|
|
QuerySQL(db, dir, "select * from a01 where a0184 in (select d from kk)", "a01", []string{"A0155", "JSNLSJ", "TBSJ", "XGSJ"})
|
|
|
|
QuerySQL(db, dir, "select * from a02 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a02", []string{})
|
|
|
|
QuerySQL(db, dir, "select * from a05 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a05", []string{})
|
|
|
|
QuerySQL(db, dir, "select * from a06 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a06", []string{})
|
|
|
|
QuerySQL(db, dir, "select * from a08 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a08", []string{})
|
|
|
|
QuerySQL(db, dir, "select * from a14 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a14", []string{})
|
|
|
|
QuerySQL(db, dir, "select * from a15 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a15", []string{})
|
|
|
|
QuerySQL(db, dir, "select * from a36 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a36", []string{})
|
|
|
|
QuerySQL(db, dir, "select * from a99z1 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a99z1", []string{})
|
|
|
|
QuerySQL(db, dir, "select * from a30 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a30", []string{})
|
|
|
|
QuerySQL(db, dir, "select * from a33 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a33", []string{})
|
|
|
|
QuerySQL(db, dir, "select * from a57 where a0000 in (select a0000 from a01 where a0184 in (select d from kk))", "a57", []string{})
|
|
|
|
|
|
|
|
// 处理照片信息
|
|
|
|
copyFileByA57(db, dir, mysqlPath)
|
|
|
|
|
|
|
|
// 进行压缩操作 并 删除压缩前目录
|
|
|
|
Zip("./"+dir, dir+".gz")
|
|
|
|
if err := os.RemoveAll("./" + dir); err != nil {
|
|
|
|
log.Fatal("删除历史目录时发生异常:", db)
|
|
|
|
}
|
|
|
|
log.Println("执行结束!")
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
copyFileByA57 复制需要备份的照片文件
|
|
|
|
*/
|
|
|
|
func copyFileByA57(db *sql.DB, dir, mysqlPath string) {
|
|
|
|
dirNew := strings.Replace(mysqlPath, "mysql/bin/", "", -1)
|
|
|
|
codeValues, _ := db.Query("select concat('tomcat8/HZBPHOTOS/', PHOTOPATH) filePath, PHOTONAME fileName from " +
|
|
|
|
"a57 where a0000 in (select a0000 from a01 where a0184 in (select d from kk));")
|
|
|
|
//返回所有列
|
|
|
|
filePath, fileName := "", ""
|
|
|
|
for codeValues.Next() {
|
|
|
|
codeValues.Scan(&filePath, &fileName)
|
|
|
|
if filePath != "" {
|
|
|
|
from := dirNew + filePath + fileName
|
|
|
|
to := "./" + dir + "/" + filePath
|
|
|
|
_ = os.MkdirAll(to, os.ModePerm)
|
|
|
|
if _, err := CopyFile(from, to+fileName); err != nil {
|
|
|
|
log.Println("发现存在照片无法复制:", from, to+fileName)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func CopyFile(src, des string) (w int64, err error) {
|
|
|
|
srcFile, _ := os.Open(src)
|
|
|
|
defer srcFile.Close()
|
|
|
|
desFile, _ := os.Create(des)
|
|
|
|
defer desFile.Close()
|
|
|
|
|
|
|
|
return io.Copy(desFile, srcFile)
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
getMySQLPath 使用注册表获取MySQL安装路径
|
|
|
|
*/
|
|
|
|
func getMySQLPathByRegistry() string {
|
|
|
|
k, err := registry.OpenKey(registry.LOCAL_MACHINE, `计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\GWY20_Mysql`, registry.ALL_ACCESS)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal("读取注册表信息时异常:", err)
|
|
|
|
}
|
|
|
|
defer k.Close()
|
|
|
|
s, _, err := k.GetStringValue("ImagePath/**/")
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal("获取注册表关于MySQL服务的地址异常:", err)
|
|
|
|
}
|
|
|
|
log.Fatal("获取注册表关于MySQL服务的地址:", s)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
func getMySQLPath(db *sql.DB) string {
|
|
|
|
codeValues, _ := db.Query("select @@datadir as dataPath from dual;")
|
|
|
|
//返回所有列
|
|
|
|
dataPath := ""
|
|
|
|
for codeValues.Next() {
|
|
|
|
codeValues.Scan(&dataPath)
|
|
|
|
}
|
|
|
|
if dataPath == "" {
|
|
|
|
log.Fatal("获取MySQL的地址异常")
|
|
|
|
}
|
|
|
|
dataPath = strings.Replace(dataPath, "\\", "/", -1)
|
|
|
|
return strings.Replace(dataPath, "data", "bin", -1)
|
|
|
|
}
|
|
|
|
|
|
|
|
func runSQL(mysqlPath, sqlPath string) {
|
|
|
|
log.Print("调用执行对应的SQL脚本:", sqlPath)
|
|
|
|
c := exec.Command("cmd", "/C", mysqlPath+"mysql -uroot -padmin hy_qggwy < "+sqlPath)
|
|
|
|
if err := c.Run(); err != nil {
|
|
|
|
log.Print("【不影响执行】执行时发生异常!异常为:", err)
|
|
|
|
}
|
|
|
|
log.Print("预置脚本数据成功!")
|
|
|
|
}
|
|
|
|
|
|
|
|
// 获取表数据
|
|
|
|
func QuerySQL(db *sql.DB, dir, sqlStr, tableName string, colNil []string) {
|
|
|
|
rows, err := db.Query(sqlStr)
|
|
|
|
log.Print("开始备份数据:", tableName, ";处理数据:", rows, ";异常情况:", err)
|
|
|
|
defer rows.Close()
|
|
|
|
cloumns, _ := rows.Columns()
|
|
|
|
values := make([]sql.RawBytes, len(cloumns))
|
|
|
|
scanArgs := make([]interface{}, len(values))
|
|
|
|
for i := range values {
|
|
|
|
scanArgs[i] = &values[i]
|
|
|
|
}
|
|
|
|
aa := ""
|
|
|
|
for rows.Next() {
|
|
|
|
_ = rows.Scan(scanArgs...)
|
|
|
|
key, value := "(", "("
|
|
|
|
aa = aa + "insert into " + tableName + " "
|
|
|
|
for i, col := range values {
|
|
|
|
kk := cloumns[i]
|
|
|
|
if inStr(colNil, kk) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if i == len(values)-1 {
|
|
|
|
key = key + kk
|
|
|
|
if value == "(" {
|
|
|
|
if col == nil {
|
|
|
|
value = value + "NULL"
|
|
|
|
} else {
|
|
|
|
value = value + "'" + string(col) + "'"
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if col == nil {
|
|
|
|
value = value + ",NULL"
|
|
|
|
} else {
|
|
|
|
value = value + ",'" + string(col) + "'"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
key = key + kk + ","
|
|
|
|
if value == "(" {
|
|
|
|
if col == nil {
|
|
|
|
value = value + "NULL"
|
|
|
|
} else {
|
|
|
|
value = value + "'" + string(col) + "'"
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if col == nil {
|
|
|
|
value = value + ",NULL"
|
|
|
|
} else {
|
|
|
|
value = value + ",'" + string(col) + "'"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
key = key + ")"
|
|
|
|
value = value + ");\n"
|
|
|
|
aa = aa + key + " values " + value
|
|
|
|
}
|
|
|
|
var path string
|
|
|
|
path = "./" + dir + "/" + tableName + "_" + time.Now().Format("2006102150405") + ".sql"
|
|
|
|
file3, _ := os.Create(path)
|
|
|
|
file3.WriteString(aa)
|
|
|
|
file3.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
func inStr(colNil []string, kk string) bool {
|
|
|
|
for _, s := range colNil {
|
|
|
|
if s == kk {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// 打包成zip文件
|
|
|
|
func Zip(src_dir string, zip_file_name string) {
|
|
|
|
|
|
|
|
// 预防:旧文件无法覆盖
|
|
|
|
os.RemoveAll(zip_file_name)
|
|
|
|
|
|
|
|
// 创建:zip文件
|
|
|
|
zipfile, _ := os.Create(zip_file_name)
|
|
|
|
defer zipfile.Close()
|
|
|
|
|
|
|
|
// 打开:zip文件
|
|
|
|
archive := zip.NewWriter(zipfile)
|
|
|
|
defer archive.Close()
|
|
|
|
|
|
|
|
// 遍历路径信息
|
|
|
|
filepath.Walk(src_dir, func(path string, info os.FileInfo, _ error) error {
|
|
|
|
|
|
|
|
// 如果是源路径,提前进行下一个遍历
|
|
|
|
if path == src_dir {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// 获取:文件头信息
|
|
|
|
header, _ := zip.FileInfoHeader(info)
|
|
|
|
header.Name = strings.TrimPrefix(path, src_dir+`/`)
|
|
|
|
|
|
|
|
// 判断:文件是不是文件夹
|
|
|
|
if info.IsDir() {
|
|
|
|
header.Name += `/`
|
|
|
|
} else {
|
|
|
|
// 设置:zip的文件压缩算法
|
|
|
|
header.Method = zip.Deflate
|
|
|
|
}
|
|
|
|
|
|
|
|
// 创建:压缩包头部信息
|
|
|
|
writer, _ := archive.CreateHeader(header)
|
|
|
|
if !info.IsDir() {
|
|
|
|
file, _ := os.Open(path)
|
|
|
|
defer file.Close()
|
|
|
|
io.Copy(writer, file)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// 打包成zip文件
|
|
|
|
func UnZip(src_file string) {
|
|
|
|
//打开并读取压缩文件中的内容
|
|
|
|
fr, err := zip.OpenReader(src_file)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
defer fr.Close()
|
|
|
|
//r.reader.file 是一个集合,里面包括了压缩包里面的所有文件
|
|
|
|
for _, file := range fr.Reader.File {
|
|
|
|
//判断文件该目录文件是否为文件夹
|
|
|
|
if file.FileInfo().IsDir() {
|
|
|
|
err := os.MkdirAll(file.Name, 0644)
|
|
|
|
if err != nil {
|
|
|
|
log.Println("判断文件该目录文件是否为文件夹:", err)
|
|
|
|
}
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
//为文件时,打开文件
|
|
|
|
r, err := file.Open()
|
|
|
|
|
|
|
|
//文件为空的时候,打印错误
|
|
|
|
if err != nil {
|
|
|
|
log.Println("文件为空的时候,打印错误")
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
//这里在控制台输出文件的文件名及路径
|
|
|
|
log.Println("进行解压文件:", file.Name)
|
|
|
|
|
|
|
|
//在对应的目录中创建相同的文件
|
|
|
|
NewFile, err := os.Create(file.Name)
|
|
|
|
if err != nil {
|
|
|
|
log.Println("在对应的目录中创建相同的文件:", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
//将内容复制
|
|
|
|
io.Copy(NewFile, r)
|
|
|
|
//关闭文件
|
|
|
|
NewFile.Close()
|
|
|
|
r.Close()
|
|
|
|
}
|
|
|
|
}
|