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")
|
|
}
|