7f7b585ffb
- 在应用程序中新增对达梦数据库(DM)的配置和连接支持 - 实现 SetDmDB 函数以配置达梦数据库连接 - 更新数据库操作逻辑,支持达梦特有的 SQL 语法和功能 - 在相关文件中添加达梦数据库的处理逻辑,包括表创建、数据插入和查询 - 更新 go.mod 和 go.sum 文件以引入达梦数据库驱动 - 增强文档,详细说明达梦数据库的配置和使用方法
152 lines
3.1 KiB
Go
152 lines
3.1 KiB
Go
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
|
||
}
|