202 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Package define ...
 | 
						|
//
 | 
						|
// Description : define ...
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 2023-09-17 18:07
 | 
						|
package define
 | 
						|
 | 
						|
import (
 | 
						|
	"git.zhangdeman.cn/zhangdeman/consts"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
// Field 表字段结构
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 11:19 2023/9/17
 | 
						|
type Field struct {
 | 
						|
	Name            string  `json:"name"`              // 字段名
 | 
						|
	Type            string  `json:"type"`              // 字段类型
 | 
						|
	Unsigned        bool    `json:"unsigned"`          // 无符号
 | 
						|
	NotNull         bool    `json:"not_null"`          // 禁止为空
 | 
						|
	DefaultValue    *string `json:"default_value"`     // 默认值
 | 
						|
	PrimaryKey      bool    `json:"primary_key"`       // 是否主键
 | 
						|
	IsAutoIncrement bool    `json:"is_auto_increment"` // 是否自增
 | 
						|
	Comment         string  `json:"comment"`           // 字段注释
 | 
						|
	OnUpdate        string  `json:"on_update"`         // 更新时自动更新数据
 | 
						|
	isFormat        bool    `json:"-"`                 // 是否格式化过
 | 
						|
}
 | 
						|
 | 
						|
// Format 格式化
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 15:08 2023/9/17
 | 
						|
func (f *Field) Format() {
 | 
						|
	if f.isFormat {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	f.isFormat = true
 | 
						|
	f.Name = strings.TrimSpace(f.Name)
 | 
						|
	if !strings.HasPrefix(f.Name, "`") {
 | 
						|
		f.Name = "`" + f.Name
 | 
						|
	}
 | 
						|
	if !strings.HasSuffix(f.Name, "`") {
 | 
						|
		f.Name = f.Name + "`"
 | 
						|
	}
 | 
						|
	f.OnUpdate = strings.TrimSpace(f.OnUpdate)
 | 
						|
	f.Type = strings.ToUpper(strings.TrimSpace(f.Type))
 | 
						|
	f.Comment = strings.TrimSpace(f.Comment)
 | 
						|
}
 | 
						|
 | 
						|
// IsInt 是否是数字类型, 条件 : 类型关键字包含int
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 15:09 2023/9/17
 | 
						|
func (f *Field) IsInt() bool {
 | 
						|
	f.Format()
 | 
						|
	return strings.Contains(f.Type, "INT")
 | 
						|
}
 | 
						|
 | 
						|
// UseAutoIncrement 是否自增
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 15:13 2023/9/17
 | 
						|
func (f *Field) UseAutoIncrement() bool {
 | 
						|
	return f.IsAutoIncrement && f.IsInt()
 | 
						|
}
 | 
						|
 | 
						|
// UseDefaultValue 使用默认值, 条件 : 非自增 + 设置了默认值
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 15:15 2023/9/17
 | 
						|
func (f *Field) UseDefaultValue() bool {
 | 
						|
	return !f.UseAutoIncrement() && !strings.Contains(strings.ToUpper(f.Type), "TEXT") && nil != f.DefaultValue
 | 
						|
}
 | 
						|
 | 
						|
// UseUnsigned 无符号
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 16:12 2023/9/17
 | 
						|
func (f *Field) UseUnsigned() bool {
 | 
						|
	return f.Unsigned && f.IsInt()
 | 
						|
}
 | 
						|
 | 
						|
// Validate 验证
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 16:10 2023/9/17
 | 
						|
func (f *Field) Validate() error {
 | 
						|
	if len(f.Name) <= 0 {
 | 
						|
		return FieldNameIsEmpty
 | 
						|
	}
 | 
						|
	if len(f.Type) == 0 {
 | 
						|
		return FieldTypeIsEmpty
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// ToString 转字符串
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 16:04 2023/9/17
 | 
						|
func (f *Field) ToString() (string, error) {
 | 
						|
	f.Format()
 | 
						|
	if err := f.Validate(); nil != err {
 | 
						|
		return "", err
 | 
						|
	}
 | 
						|
	fieldTpl := f.getFieldTpl()
 | 
						|
	if f.PrimaryKey && DatabaseDriver == consts.DatabaseDriverSqlite3 {
 | 
						|
		f.Type = "INTEGER PRIMARY KEY AUTOINCREMENT"
 | 
						|
	}
 | 
						|
	dataReplaceTable := map[string]string{
 | 
						|
		FieldName:          f.Name, // 字段名
 | 
						|
		FieldType:          f.Type, // 字段类型
 | 
						|
		FieldUnsigned:      "",     // 无符号
 | 
						|
		FieldNotNull:       "",     // 不为空
 | 
						|
		FieldAutoIncrement: "",     // 是否自增
 | 
						|
		FieldDefaultValue:  "",     // 默认值
 | 
						|
		FieldOnUpdate:      "",     // 自动更新
 | 
						|
	}
 | 
						|
 | 
						|
	// 是否有符号, 整数且设置有符号
 | 
						|
	if f.UseUnsigned() {
 | 
						|
		dataReplaceTable[FieldUnsigned] = "UNSIGNED"
 | 
						|
	}
 | 
						|
 | 
						|
	// 是否为空
 | 
						|
	if f.NotNull {
 | 
						|
		dataReplaceTable[FieldNotNull] = "NOT NULL"
 | 
						|
	}
 | 
						|
 | 
						|
	// 是否自增
 | 
						|
	if f.UseAutoIncrement() {
 | 
						|
		dataReplaceTable[FieldAutoIncrement] = "AUTO_INCREMENT"
 | 
						|
	}
 | 
						|
 | 
						|
	// 默认值
 | 
						|
	if f.UseDefaultValue() {
 | 
						|
		defaultVal := *f.DefaultValue
 | 
						|
		if strings.Contains(defaultVal, "()") {
 | 
						|
			// 默认值是Mysql函数
 | 
						|
			dataReplaceTable[FieldDefaultValue] = "DEFAULT " + defaultVal
 | 
						|
		} else {
 | 
						|
			// 默认值是指定的固定值
 | 
						|
			if f.IsInt() {
 | 
						|
				dataReplaceTable[FieldDefaultValue] = "DEFAULT " + defaultVal
 | 
						|
			} else {
 | 
						|
				dataReplaceTable[FieldDefaultValue] = "DEFAULT '" + defaultVal + "'"
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if len(f.OnUpdate) > 0 {
 | 
						|
		dataReplaceTable[FieldOnUpdate] = " ON UPDATE " + f.OnUpdate
 | 
						|
	}
 | 
						|
 | 
						|
	// 注释
 | 
						|
	f.Comment = strings.TrimSpace(f.Comment)
 | 
						|
	if len(f.Comment) > 0 {
 | 
						|
		dataReplaceTable[FieldComment] = "COMMENT '" + f.Comment + "'"
 | 
						|
	}
 | 
						|
 | 
						|
	for source, target := range dataReplaceTable {
 | 
						|
		fieldTpl = strings.ReplaceAll(fieldTpl, source, target)
 | 
						|
	}
 | 
						|
	return fieldTpl, nil
 | 
						|
}
 | 
						|
 | 
						|
// ToStringIgnoreError ...
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 15:59 2023/9/18
 | 
						|
func (f *Field) ToStringIgnoreError() string {
 | 
						|
	sql, _ := f.ToString()
 | 
						|
	return sql
 | 
						|
}
 | 
						|
 | 
						|
// getFieldTpl 表字段模板
 | 
						|
//
 | 
						|
// Author : go_developer@163.com<白茶清欢>
 | 
						|
//
 | 
						|
// Date : 15:14 2024/6/17
 | 
						|
func (f *Field) getFieldTpl() string {
 | 
						|
	switch DatabaseDriver {
 | 
						|
	case consts.DatabaseDriverMysql:
 | 
						|
		return MysqlFieldTpl
 | 
						|
	case consts.DatabaseDriverSqlite3:
 | 
						|
		return SqliteFieldTpl
 | 
						|
	}
 | 
						|
	panic(DatabaseDriver + " : database driver is not support")
 | 
						|
}
 |