package db import ( . "code.hoteas.com/golang/hotime/common" "os" "strings" ) // backupSave 保存备份 // path: 备份文件路径 // tt: 表名 // code: 备份类型 0=全部, 1=仅数据, 2=仅DDL func (that *HoTimeDB) backupSave(path string, tt string, code int) { fd, _ := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) defer fd.Close() q := "`" if that.Dialect != nil { q = that.Dialect.QuoteChar() } str := "\r\n" if code == 0 || code == 2 { str += that.backupDdl(tt) } if code == 0 || code == 1 { str += "insert into " + q + tt + q + "\r\n\r\n(" str += that.backupCol(tt) } _, _ = fd.Write([]byte(str)) } // backupDdl 备份表结构(DDL) func (that *HoTimeDB) backupDdl(tt string) string { switch that.Type { case "dm", "dameng": return that.backupDdlDM(tt) default: data := that.Query("show create table " + tt) if len(data) == 0 { return "" } return ObjToStr(data[0]["Create Table"]) + ";\r\n\r\n" } } // backupDdlDM 达梦数据库 DDL 导出 func (that *HoTimeDB) backupDdlDM(tt string) string { cols := that.Query(`SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME='` + tt + `' ORDER BY COLUMN_ID`) if len(cols) == 0 { return "" } ddl := "CREATE TABLE \"" + tt + "\" (\r\n" for i, col := range cols { name := col.GetString("COLUMN_NAME") dtype := col.GetString("DATA_TYPE") nullable := col.GetString("NULLABLE") defVal := col.GetString("DATA_DEFAULT") colDef := " \"" + name + "\" " + dtype prec := col.GetInt("DATA_PRECISION") scale := col.GetInt("DATA_SCALE") length := col.GetInt("DATA_LENGTH") if prec > 0 { colDef += "(" + ObjToStr(prec) if scale > 0 { colDef += "," + ObjToStr(scale) } colDef += ")" } else if length > 0 && (strings.Contains(strings.ToUpper(dtype), "CHAR") || strings.Contains(strings.ToUpper(dtype), "BINARY")) { colDef += "(" + ObjToStr(length) + ")" } if nullable == "N" { colDef += " NOT NULL" } if defVal != "" { colDef += " DEFAULT " + strings.TrimSpace(defVal) } if i < len(cols)-1 { colDef += "," } ddl += colDef + "\r\n" } ddl += ");\r\n\r\n" return ddl } // backupCol 备份表数据 func (that *HoTimeDB) backupCol(tt string) string { q := "`" if that.Dialect != nil { q = that.Dialect.QuoteChar() } str := "" data := that.Select(tt, "*") lthData := len(data) if lthData == 0 { return str } lthCol := len(data[0]) col := make([]string, lthCol) tempLthData := 0 for k := range data[0] { if tempLthData == lthCol-1 { str += q + k + q + ") " } else { str += q + k + q + "," } col[tempLthData] = k tempLthData++ } str += " values" for j := 0; j < lthData; j++ { for m := 0; m < lthCol; m++ { if m == 0 { str += "(" } v := "NULL" if data[j][col[m]] != nil { v = "'" + strings.Replace(ObjToStr(data[j][col[m]]), "'", `\'`, -1) + "'" } if m == lthCol-1 { str += v + ") " } else { str += v + "," } } if j == lthData-1 { str += ";\r\n\r\n" } else { str += ",\r\n\r\n" } } return str }