升级数据表结构体生成的内容
This commit is contained in:
@ -20,15 +20,15 @@ func GenerateDao(sql string, packageName string, withGetTableNameFunc bool) (str
|
||||
if len(packageName) == 0 {
|
||||
packageName = "dao"
|
||||
}
|
||||
dataStruct, basic, err := ParseCreateTableSql(sql, withGetTableNameFunc)
|
||||
basic, err := ParseCreateTableSql(sql)
|
||||
if nil != err {
|
||||
return "", err
|
||||
}
|
||||
replaceTable := map[string]string{
|
||||
"{PACKAGE}": packageName,
|
||||
"{DATA_STRUCT_DAO}": basic.ModelStruct + "Dao",
|
||||
"{DATA_STRUCT_DAO}": basic.ModelStructName + "Dao",
|
||||
"{DATA_STRUCT_NAME}": basic.ModelStruct,
|
||||
"{DATA_STRUCT}": dataStruct,
|
||||
"{DATA_STRUCT}": basic.ModelStruct,
|
||||
"{DAO_RECEIVER}": getDaoReceiver(basic.TableName),
|
||||
"{DB_TABLE_NAME}": basic.TableName,
|
||||
"{PRIMARY_KEY}": "ID",
|
||||
|
142
sql2go/parser.go
142
sql2go/parser.go
@ -18,6 +18,12 @@ import (
|
||||
const (
|
||||
// CreateSQLColumnTPL 每个字段的模版
|
||||
CreateSQLColumnTPL = " {FIELD} {TYPE} `json:\"{JSON_TAG}\" gorm:\"column:{COLUMN};default:{DEFAULT_VALUE};{NOT_NULL}\"` // {COMMENT}"
|
||||
// TableColumnTpl 每个字段的模版
|
||||
TableColumnTpl = " {FIELD} string `json:\"{JSON_TAG}\"`"
|
||||
// TableColumnDescTpl 字段描述
|
||||
TableColumnDescTpl = " {FIELD}: \"{JSON_TAG}\"`"
|
||||
// TableColumnCommentTpl 字段描述
|
||||
TableColumnCommentTpl = " \"{JSON_TAG}\": \"{FIELD_COMMENT}\"`"
|
||||
)
|
||||
|
||||
// BasicTableInfo ...
|
||||
@ -26,10 +32,13 @@ const (
|
||||
//
|
||||
// Date : 11:47 上午 2021/11/17
|
||||
type BasicTableInfo struct {
|
||||
TableName string
|
||||
ModelStruct string
|
||||
PrimaryField string
|
||||
PrimaryFieldType string
|
||||
TableName string `json:"table_name"` // 表名称
|
||||
ModelStructName string `json:"model_struct_name"` // 生成的结构体名称
|
||||
ModelStruct string `json:"model_struct"` // 生成的结构体内容
|
||||
PrimaryField string `json:"primary_field"` // 主键字段
|
||||
PrimaryFieldType string `json:"primary_field_type"` // 主键字段类型
|
||||
ColumnDefined string `json:"column_defined"` // 字段定义
|
||||
ColumnDescDefined string `json:"column_desc_defined"` // 字段描述定义
|
||||
}
|
||||
|
||||
// ParseCreateTableSql 解析建表sql
|
||||
@ -37,32 +46,51 @@ type BasicTableInfo struct {
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 4:49 下午 2021/10/25
|
||||
func ParseCreateTableSql(sql string, withGetTableFunc bool) (string, *BasicTableInfo, error) {
|
||||
func ParseCreateTableSql(sql string) (*BasicTableInfo, error) {
|
||||
var (
|
||||
stmt sqlparser.Statement
|
||||
err error
|
||||
basic *BasicTableInfo
|
||||
)
|
||||
basic = &BasicTableInfo{
|
||||
TableName: "",
|
||||
ModelStruct: "",
|
||||
PrimaryField: "ID",
|
||||
PrimaryFieldType: "",
|
||||
TableName: "",
|
||||
ModelStructName: "",
|
||||
ModelStruct: "",
|
||||
PrimaryField: "ID",
|
||||
PrimaryFieldType: "",
|
||||
ColumnDefined: "",
|
||||
ColumnDescDefined: "",
|
||||
}
|
||||
sql = strings.ReplaceAll(strings.ReplaceAll(sql, "CURRENT_TIMESTAMP()", "CURRENT_TIMESTAMP"), "current_timestamp()", "CURRENT_TIMESTAMP")
|
||||
if stmt, err = sqlparser.ParseStrictDDL(sql); nil != err {
|
||||
return "", nil, err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r, ok := stmt.(*sqlparser.DDL)
|
||||
if !ok {
|
||||
return "", nil, errors.New("input sql is not ddl")
|
||||
return nil, errors.New("input sql is not ddl")
|
||||
}
|
||||
basic.TableName = sqlparser.String(r.NewName)
|
||||
basic.ModelStruct = wrapperType.String(basic.TableName).SnakeCaseToCamel()
|
||||
structResult := "type " + basic.ModelStruct + " struct { \n"
|
||||
basic.ModelStructName = wrapperType.String(basic.TableName).SnakeCaseToCamel()
|
||||
|
||||
for _, item := range r.TableSpec.Columns {
|
||||
// 生成model sql
|
||||
basic.ModelStruct = generateTable(basic.TableName, basic.ModelStructName, r.TableSpec.Columns)
|
||||
// 生成表字段定义
|
||||
columnDefined, _, getColumnFunc := generateTableColumnDefined(basic.ModelStructName, r.TableSpec.Columns)
|
||||
basic.ColumnDescDefined = columnDefined
|
||||
basic.ModelStruct += getColumnFunc
|
||||
return basic, nil
|
||||
}
|
||||
|
||||
// generateTable 生成表结构定义
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 20:29 2024/4/14
|
||||
func generateTable(tableName string, modelStructName string, columnList []*sqlparser.ColumnDefinition) string {
|
||||
structResult := "type " + modelStructName + " struct { \n"
|
||||
|
||||
for _, item := range columnList {
|
||||
comment := ""
|
||||
if item.Type.Comment == nil {
|
||||
comment = item.Name.String()
|
||||
@ -77,9 +105,9 @@ func ParseCreateTableSql(sql string, withGetTableFunc bool) (string, *BasicTable
|
||||
"{COMMENT}": comment,
|
||||
"{TYPE}": sqlTypeMap[item.Type.Type],
|
||||
}
|
||||
if data["{FIELD}"] == "ID" {
|
||||
/*if data["{FIELD}"] == "ID" {
|
||||
basic.PrimaryFieldType = data["{TYPE}"]
|
||||
}
|
||||
}*/
|
||||
if item.Type.NotNull {
|
||||
data["{NOT_NULL}"] = "NOT NULL"
|
||||
}
|
||||
@ -93,25 +121,83 @@ func ParseCreateTableSql(sql string, withGetTableFunc bool) (string, *BasicTable
|
||||
structResult += val + "\n"
|
||||
}
|
||||
structResult = structResult + "}"
|
||||
if withGetTableFunc {
|
||||
// 生成表名称获取方法
|
||||
tableFirst := string([]byte(basic.TableName)[:1])
|
||||
funcTpl := `
|
||||
// 生成表名称获取方法
|
||||
tableFirst := string([]byte(tableName)[:1])
|
||||
funcTpl := `
|
||||
|
||||
// TableName 获取表名称
|
||||
func ({{TABLE_FIRST}} {{TABLE_STRUCT_NAME}}) TableName() string {
|
||||
return "{{TABLE_NAME}}"
|
||||
}`
|
||||
replaceTable := map[string]string{
|
||||
"{{TABLE_FIRST}}": tableFirst,
|
||||
"{{TABLE_STRUCT_NAME}}": basic.ModelStruct,
|
||||
"{{TABLE_NAME}}": basic.TableName,
|
||||
replaceTable := map[string]string{
|
||||
"{{TABLE_FIRST}}": tableFirst,
|
||||
"{{TABLE_STRUCT_NAME}}": modelStructName,
|
||||
"{{TABLE_NAME}}": tableName,
|
||||
}
|
||||
for k, v := range replaceTable {
|
||||
funcTpl = strings.ReplaceAll(funcTpl, k, v)
|
||||
}
|
||||
structResult = structResult + funcTpl
|
||||
return structResult
|
||||
}
|
||||
|
||||
// generateTableColumnDefined 生成表结构定义 + 表结构初始化
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 20:35 2024/4/14
|
||||
func generateTableColumnDefined(modelStructName string, columnList []*sqlparser.ColumnDefinition) (string, string, string) {
|
||||
columnDefineName := modelStructName + "Column"
|
||||
structFieldResult := "type " + columnDefineName + " struct { \n"
|
||||
structFieldDescInstanceResult := "&" + columnDefineName + "{ \n"
|
||||
structFieldCommentInstanceResult := "map[string]string{ \n"
|
||||
for _, column := range columnList {
|
||||
dataMap := map[string]string{
|
||||
"{FIELD}": wrapperType.String(column.Name.String()).SnakeCaseToCamel(),
|
||||
"{JSON_TAG}": column.Name.String(),
|
||||
"{FIELD_COMMENT}": wrapperType.TernaryOperator.String(
|
||||
column.Type.Comment == nil,
|
||||
wrapperType.String(column.Name.String()),
|
||||
wrapperType.String(string(column.Type.Comment.Val)),
|
||||
).Value(),
|
||||
}
|
||||
for k, v := range replaceTable {
|
||||
funcTpl = strings.ReplaceAll(funcTpl, k, v)
|
||||
|
||||
structFieldDefine := TableColumnTpl
|
||||
structFieldDescDefine := TableColumnDescTpl
|
||||
structFieldCommentDefine := TableColumnCommentTpl
|
||||
for k, v := range dataMap {
|
||||
structFieldDefine = strings.ReplaceAll(structFieldDefine, k, v)
|
||||
structFieldDescDefine = strings.ReplaceAll(structFieldDescDefine, k, v)
|
||||
structFieldCommentDefine = strings.ReplaceAll(structFieldCommentDefine, k, v)
|
||||
}
|
||||
structResult = structResult + funcTpl
|
||||
structFieldResult += structFieldDefine + "\n"
|
||||
structFieldDescInstanceResult += structFieldDescDefine + ",\n"
|
||||
structFieldCommentInstanceResult += structFieldCommentDefine + ",\n"
|
||||
}
|
||||
structFieldResult += "}"
|
||||
structFieldDescInstanceResult += "}"
|
||||
structFieldCommentInstanceResult += "}"
|
||||
tableColumnFunction := `
|
||||
|
||||
// Columns 获取表字段定义
|
||||
func ({TABLE_FIRST} {MODEL_STRUCT_NAME}) Columns() *{COLUMN_DEFINED} {
|
||||
return {STRUCT_FIELD_DESC_DEFINED_RESULT}
|
||||
}
|
||||
|
||||
return structResult, basic, nil
|
||||
// ColumnComment 获取表字段描述
|
||||
func ({TABLE_FIRST} {MODEL_STRUCT_NAME}) ColumnComment() map[string]string {
|
||||
return {STRUCT_FIELD_COMMENT_DEFINED_RESULT}
|
||||
}
|
||||
`
|
||||
dataMap := map[string]string{
|
||||
"{COLUMN_DEFINED}": columnDefineName,
|
||||
"{TABLE_FIRST}": string([]byte(strings.ToLower(modelStructName))[:1]),
|
||||
"{MODEL_STRUCT_NAME}": modelStructName,
|
||||
"{STRUCT_FIELD_DESC_DEFINED_RESULT}": structFieldDescInstanceResult,
|
||||
"{STRUCT_FIELD_COMMENT_DEFINED_RESULT}": structFieldCommentInstanceResult,
|
||||
}
|
||||
for k, v := range dataMap {
|
||||
tableColumnFunction = strings.ReplaceAll(tableColumnFunction, k, v)
|
||||
}
|
||||
return structFieldResult, structFieldDescInstanceResult, tableColumnFunction
|
||||
}
|
||||
|
@ -14,10 +14,10 @@ import (
|
||||
|
||||
func TestParseSql(t *testing.T) {
|
||||
sql := "CREATE TABLE `app` (\n `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',\n `code` varchar(128) NOT NULL DEFAULT '' COMMENT '分配的app_code',\n `secret` varchar(64) NOT NULL DEFAULT '' COMMENT '分配的私钥',\n `status` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '当前状态 o - 初始化 1- 使用中 2 - 禁用 3 - 删除',\n `description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述信息',\n `apply_user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '申请人姓名',\n `apply_user_contact` varchar(128) NOT NULL DEFAULT '' COMMENT '申请人联系方式',\n `create_user_id` varchar(128) NOT NULL DEFAULT '' COMMENT '创建人ID',\n `modify_user_id` varchar(128) NOT NULL DEFAULT '' COMMENT '修改人ID',\n PRIMARY KEY (`id`),\n UNIQUE KEY `uniq_code` (`code`)\n) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8mb4 COMMENT='APP信息表'"
|
||||
fmt.Println(ParseCreateTableSql(sql, true))
|
||||
fmt.Println(ParseCreateTableSql(sql))
|
||||
}
|
||||
|
||||
func TestParseSqlForNoComment(t *testing.T) {
|
||||
sql := "CREATE TABLE `app` (\n `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\n `code` varchar(128) NOT NULL DEFAULT '' COMMENT '分配的app_code',\n `secret` varchar(64) NOT NULL DEFAULT '' COMMENT '分配的私钥',\n `status` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '当前状态 o - 初始化 1- 使用中 2 - 禁用 3 - 删除',\n `description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述信息',\n `apply_user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '申请人姓名',\n `apply_user_contact` varchar(128) NOT NULL DEFAULT '' COMMENT '申请人联系方式',\n `create_user_id` varchar(128) NOT NULL DEFAULT '' COMMENT '创建人ID',\n `modify_user_id` varchar(128) NOT NULL DEFAULT '' COMMENT '修改人ID',\n PRIMARY KEY (`id`),\n UNIQUE KEY `uniq_code` (`code`)\n) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8mb4 COMMENT='APP信息表'"
|
||||
fmt.Println(ParseCreateTableSql(sql, true))
|
||||
fmt.Println(ParseCreateTableSql(sql))
|
||||
}
|
||||
|
Reference in New Issue
Block a user