186 lines
4.7 KiB
Go
186 lines
4.7 KiB
Go
// Package define ...
|
|
//
|
|
// Description : define ...
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 2023-09-17 11:19
|
|
package define
|
|
|
|
import (
|
|
"fmt"
|
|
"git.zhangdeman.cn/zhangdeman/consts"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
DatabaseDriver = consts.DatabaseDriverMysql
|
|
)
|
|
|
|
// SetDatabaseDriver 设置数据库驱动
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 14:48 2024/6/17
|
|
func SetDatabaseDriver(databaseDriver string) {
|
|
DatabaseDriver = databaseDriver
|
|
}
|
|
|
|
// 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 := t.getTableSqlTpl()
|
|
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 nil, err
|
|
}
|
|
fieldList = append(fieldList, fieldStr)
|
|
}
|
|
indexList := make([]string, 0)
|
|
for _, item := range t.IndexList {
|
|
indexStr, err := item.ToString(t.Name)
|
|
if nil != err {
|
|
return nil, err
|
|
}
|
|
if len(indexStr) == 0 {
|
|
continue
|
|
}
|
|
indexList = append(indexList, indexStr)
|
|
}
|
|
replaceTable[TableFieldList] = strings.Join(fieldList, ",")
|
|
if len(indexList) > 0 && consts.DatabaseDriverMysql == DatabaseDriver {
|
|
replaceTable[TableIndexList] = "," + strings.Join(indexList, ",")
|
|
indexList = make([]string, 0)
|
|
}
|
|
|
|
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 append([]string{tableTpl}, indexList...), nil
|
|
}
|
|
|
|
// ToStringIgnoreError ...
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 15:59 2023/9/18
|
|
func (t *Table) ToStringIgnoreError() []string {
|
|
sql, _ := t.ToString()
|
|
return sql
|
|
}
|
|
|
|
// getTableSqlTpl 获取表结构的模板
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 14:50 2024/6/17
|
|
func (t *Table) getTableSqlTpl() string {
|
|
switch DatabaseDriver {
|
|
case consts.DatabaseDriverMysql:
|
|
return MysqlTableTpl
|
|
case consts.DatabaseDriverSqlite3:
|
|
return SqliteTableTpl
|
|
}
|
|
panic(DatabaseDriver + " : database driver is not support")
|
|
}
|