package serf
|
|
import (
|
"errors"
|
"fmt"
|
"strings"
|
|
"github.com/jinzhu/gorm"
|
)
|
|
type DumpSql struct {
|
Sql string `json:"sql"`
|
}
|
|
type TableDesc struct {
|
Cid int `json:"cid"`
|
Name string `json:"name"`
|
Type string `json:"type"`
|
Notnull bool `json:"notnull"`
|
DFltValue interface{} `json:"dflt_value"`
|
Pk int `json:"pk"`
|
}
|
|
var syncSqlChan = make(chan string, 10)
|
|
func DumpTables(db *gorm.DB, tableNames []string) ([]string, error) {
|
db.LogMode(false)
|
defer db.LogMode(true)
|
|
if tableNames != nil {
|
var arr []string
|
var dumpSql []DumpSql
|
|
for _, table := range tableNames {
|
fmt.Println("dump current tableName:", table)
|
|
dumpSql = make([]DumpSql, 0)
|
var tDescArr []TableDesc
|
|
tSql := fmt.Sprintf(`PRAGMA table_info("%s")`, table)
|
err := db.Raw(tSql).Scan(&tDescArr).Error
|
if err != nil {
|
return nil, errors.New("tableDesc err")
|
}
|
|
if tDescArr == nil || len(tDescArr) == 0 {
|
continue
|
}
|
|
var columnNames []string
|
var columnValues []string
|
for _, col := range tDescArr {
|
columnNames = append(columnNames, col.Name)
|
columnValues = append(columnValues, fmt.Sprintf(`'||quote("%s")||'`, col.Name))
|
}
|
|
tSql = fmt.Sprintf(`SELECT 'INSERT INTO "%s" (%s) VALUES(%s)' as sql FROM "%s";`,
|
table,
|
strings.Join(columnNames, ","),
|
strings.Join(columnValues, ","),
|
table)
|
//fmt.Println("tSql:", tSql)
|
|
err = db.Raw(tSql).Scan(&dumpSql).Error
|
if err != nil {
|
return nil, errors.New("dump err")
|
}
|
|
if len(dumpSql) > 0 {
|
for _, d := range dumpSql {
|
arr = append(arr, d.Sql)
|
}
|
}
|
}
|
|
return arr, nil
|
}
|
|
return nil, errors.New("tableNames is nil")
|
}
|