迁移数据库初始化安装能力
This commit is contained in:
153
install/define/table.go
Normal file
153
install/define/table.go
Normal file
@ -0,0 +1,153 @@
|
||||
// Package define ...
|
||||
//
|
||||
// Description : define ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2023-09-17 11:19
|
||||
package define
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Table 数据表的数据结构
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 11:22 2023/9/17
|
||||
type Table struct {
|
||||
Name string `json:"name"` // 表名称
|
||||
Engine string `json:"engine"` // 存储引擎
|
||||
DefaultCharset string `json:"default_charset"` // 默认编码
|
||||
DefaultCollate string `json:"default_collate"` // 默认集合
|
||||
Comment string `json:"comment"` // 表注释
|
||||
AutoIncrement int `json:"auto_increment"` // 自增起始值
|
||||
FieldList []*Field `json:"field_list"` // 表字段列表
|
||||
IndexList []*Index `json:"index_list"` // 表索引列表
|
||||
isFormat bool `json:"-"` // 是否格式化过
|
||||
}
|
||||
|
||||
// Format 格式化
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 18:14 2023/9/17
|
||||
func (t *Table) Format() {
|
||||
if t.isFormat {
|
||||
return
|
||||
}
|
||||
t.isFormat = true
|
||||
t.Name = strings.TrimSpace(t.Name)
|
||||
t.Engine = strings.TrimSpace(t.Engine)
|
||||
if len(t.Engine) == 0 {
|
||||
t.Engine = "InnoDB"
|
||||
}
|
||||
t.DefaultCharset = strings.TrimSpace(t.DefaultCharset)
|
||||
if len(t.DefaultCharset) == 0 {
|
||||
t.DefaultCharset = "utf8mb4"
|
||||
}
|
||||
t.DefaultCollate = strings.TrimSpace(t.DefaultCollate)
|
||||
if len(t.DefaultCollate) == 0 {
|
||||
t.DefaultCollate = "utf8mb4_general_ci"
|
||||
}
|
||||
for _, item := range t.FieldList {
|
||||
item.Format()
|
||||
}
|
||||
for _, item := range t.IndexList {
|
||||
item.Format()
|
||||
}
|
||||
}
|
||||
|
||||
// Validate 数据验证
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 18:23 2023/9/17
|
||||
func (t *Table) Validate() error {
|
||||
t.Format()
|
||||
if len(t.Name) <= 2 {
|
||||
return TableNameIsEmpty
|
||||
}
|
||||
if len(t.FieldList) == 0 {
|
||||
return TableFieldListIsEmpty
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ToString 生成sql
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 18:46 2023/9/17
|
||||
func (t *Table) ToString() (string, error) {
|
||||
tableTpl := MysqlTableTpl
|
||||
replaceTable := map[string]string{
|
||||
TableName: t.Name, // 表名
|
||||
TableFieldList: "", // 表字段
|
||||
TableIndexList: "", // 表索引
|
||||
TableEngine: "", // 表引擎
|
||||
TableAutoIncrement: "", // 自增起点
|
||||
TableDefaultCharset: "", // 默认编码
|
||||
TableDefaultCollate: "", // 默认字符集
|
||||
TableComment: "", // 表注释
|
||||
}
|
||||
fieldList := make([]string, 0)
|
||||
for _, item := range t.FieldList {
|
||||
fieldStr, err := item.ToString()
|
||||
if nil != err {
|
||||
return "", err
|
||||
}
|
||||
fieldList = append(fieldList, fieldStr)
|
||||
}
|
||||
indexList := make([]string, 0)
|
||||
for _, item := range t.IndexList {
|
||||
indexStr, err := item.ToString()
|
||||
if nil != err {
|
||||
return "", err
|
||||
}
|
||||
indexList = append(indexList, indexStr)
|
||||
}
|
||||
if len(indexList) == 0 {
|
||||
replaceTable[TableFieldList] = strings.Join(fieldList, ",")
|
||||
} else {
|
||||
replaceTable[TableFieldList] = strings.Join(fieldList, ",") + ","
|
||||
}
|
||||
replaceTable[TableIndexList] = strings.Join(indexList, ",")
|
||||
|
||||
if len(t.Engine) > 0 {
|
||||
replaceTable[TableEngine] = "ENGINE=" + t.Engine
|
||||
}
|
||||
if t.AutoIncrement > 0 {
|
||||
replaceTable[TableAutoIncrement] = fmt.Sprintf("AUTO_INCREMENT=%v", t.AutoIncrement)
|
||||
}
|
||||
|
||||
if len(t.DefaultCharset) > 0 {
|
||||
replaceTable[TableDefaultCharset] = "DEFAULT CHARSET=" + t.DefaultCharset
|
||||
}
|
||||
if len(t.DefaultCollate) > 0 {
|
||||
if len(replaceTable[TableDefaultCharset]) == 0 {
|
||||
replaceTable[TableDefaultCollate] = "DEFAULT COLLATE=" + t.DefaultCollate
|
||||
} else {
|
||||
replaceTable[TableDefaultCollate] = "COLLATE=" + t.DefaultCollate
|
||||
}
|
||||
}
|
||||
if len(t.Comment) > 0 {
|
||||
replaceTable[TableComment] = fmt.Sprintf("COMMENT='%v'", t.Comment)
|
||||
}
|
||||
for source, target := range replaceTable {
|
||||
tableTpl = strings.ReplaceAll(tableTpl, source, target)
|
||||
}
|
||||
return tableTpl, nil
|
||||
}
|
||||
|
||||
// ToStringIgnoreError ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:59 2023/9/18
|
||||
func (t *Table) ToStringIgnoreError() string {
|
||||
sql, _ := t.ToString()
|
||||
return sql
|
||||
}
|
Reference in New Issue
Block a user