Fix issues (#931)
* fix #929 * fix #925 * add test case * update model README * fix #929 * fix #929 * fix #929 * refactor dir * Adding todo comments Co-authored-by: anqiansong <anqiansong@xiaoheiban.cn>
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
|||||||
|
|
||||||
"github.com/tal-tech/go-zero/tools/goctl/api/spec"
|
"github.com/tal-tech/go-zero/tools/goctl/api/spec"
|
||||||
"github.com/tal-tech/go-zero/tools/goctl/config"
|
"github.com/tal-tech/go-zero/tools/goctl/config"
|
||||||
|
"github.com/tal-tech/go-zero/tools/goctl/internal/env"
|
||||||
"github.com/tal-tech/go-zero/tools/goctl/util"
|
"github.com/tal-tech/go-zero/tools/goctl/util"
|
||||||
"github.com/tal-tech/go-zero/tools/goctl/util/format"
|
"github.com/tal-tech/go-zero/tools/goctl/util/format"
|
||||||
"github.com/tal-tech/go-zero/tools/goctl/vars"
|
"github.com/tal-tech/go-zero/tools/goctl/vars"
|
||||||
@@ -17,6 +18,7 @@ const handlerTemplate = `package handler
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
{{if .After1_1_10}}"github.com/tal-tech/go-zero/rest/httpx"{{end}}
|
||||||
{{.ImportPackages}}
|
{{.ImportPackages}}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -47,6 +49,7 @@ type handlerInfo struct {
|
|||||||
Call string
|
Call string
|
||||||
HasResp bool
|
HasResp bool
|
||||||
HasRequest bool
|
HasRequest bool
|
||||||
|
After1_1_10 bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func genHandler(dir, rootPkg string, cfg *config.Config, group spec.Group, route spec.Route) error {
|
func genHandler(dir, rootPkg string, cfg *config.Config, group spec.Group, route spec.Route) error {
|
||||||
@@ -55,9 +58,13 @@ func genHandler(dir, rootPkg string, cfg *config.Config, group spec.Group, route
|
|||||||
handler = strings.Title(handler)
|
handler = strings.Title(handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
goctlVersion := env.GetGoctlVersion()
|
||||||
|
// todo(anqiansong): This will be removed after a certain number of production versions of goctl (probably 5)
|
||||||
|
after1_1_10 := env.IsVersionGatherThan(goctlVersion, "1.1.10")
|
||||||
return doGenToFile(dir, handler, cfg, group, route, handlerInfo{
|
return doGenToFile(dir, handler, cfg, group, route, handlerInfo{
|
||||||
ImportPackages: genHandlerImports(group, route, rootPkg),
|
ImportPackages: genHandlerImports(group, route, rootPkg),
|
||||||
HandlerName: handler,
|
HandlerName: handler,
|
||||||
|
After1_1_10: after1_1_10,
|
||||||
RequestType: util.Title(route.RequestTypeName()),
|
RequestType: util.Title(route.RequestTypeName()),
|
||||||
LogicType: strings.Title(getLogicName(route)),
|
LogicType: strings.Title(getLogicName(route)),
|
||||||
Call: strings.Title(strings.TrimSuffix(handler, "Handler")),
|
Call: strings.Title(strings.TrimSuffix(handler, "Handler")),
|
||||||
@@ -105,7 +112,12 @@ func genHandlerImports(group spec.Group, route spec.Route, parentPkg string) str
|
|||||||
if len(route.RequestTypeName()) > 0 {
|
if len(route.RequestTypeName()) > 0 {
|
||||||
imports = append(imports, fmt.Sprintf("\"%s\"\n", util.JoinPackages(parentPkg, typesDir)))
|
imports = append(imports, fmt.Sprintf("\"%s\"\n", util.JoinPackages(parentPkg, typesDir)))
|
||||||
}
|
}
|
||||||
imports = append(imports, fmt.Sprintf("\"%s/rest/httpx\"", vars.ProjectOpenSourceURL))
|
|
||||||
|
currentVersion := env.GetGoctlVersion()
|
||||||
|
// todo(anqiansong): This will be removed after a certain number of production versions of goctl (probably 5)
|
||||||
|
if !env.IsVersionGatherThan(currentVersion, "1.1.10") {
|
||||||
|
imports = append(imports, fmt.Sprintf("\"%s/rest/httpx\"", vars.ProjectOpenSourceURL))
|
||||||
|
}
|
||||||
|
|
||||||
return strings.Join(imports, "\n\t")
|
return strings.Join(imports, "\n\t")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
buildVersion = "1.1.10"
|
buildVersion = "1.1.11-beta"
|
||||||
commands = []cli.Command{
|
commands = []cli.Command{
|
||||||
{
|
{
|
||||||
Name: "upgrade",
|
Name: "upgrade",
|
||||||
@@ -655,3 +655,7 @@ func main() {
|
|||||||
fmt.Println(aurora.Red("error: " + err.Error()))
|
fmt.Println(aurora.Red("error: " + err.Error()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
os.Setenv("GOCTL_VERSION", buildVersion)
|
||||||
|
}
|
||||||
|
|||||||
59
tools/goctl/internal/env/env.go
vendored
Normal file
59
tools/goctl/internal/env/env.go
vendored
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package env
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetGoctlVersion obtains from the environment variable GOCTL_VERSION, prior to 1.1.11,
|
||||||
|
// the goctl version was 1.1.10 by default.
|
||||||
|
// the goctl version is set at runtime in the environment variable GOCTL_VERSION,
|
||||||
|
// see the detail at https://github.com/tal-tech/go-zero/blob/master/tools/goctl/goctl.go
|
||||||
|
func GetGoctlVersion() string {
|
||||||
|
currentVersion := os.Getenv("GOCTL_VERSION")
|
||||||
|
if currentVersion == "" {
|
||||||
|
currentVersion = "1.1.10"
|
||||||
|
}
|
||||||
|
return currentVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
var tag = map[string]int{"pre-alpha": 0, "alpha": 1, "pre-bata": 2, "beta": 3, "released": 4, "": 5}
|
||||||
|
|
||||||
|
// IsVersionGatherThan compares whether the current goctl version
|
||||||
|
// is gather than the target version
|
||||||
|
func IsVersionGatherThan(version, target string) bool {
|
||||||
|
versionNumber, versionTag := convertVersion(version)
|
||||||
|
targetVersionNumber, targetTag := convertVersion(target)
|
||||||
|
if versionNumber > targetVersionNumber {
|
||||||
|
return true
|
||||||
|
} else if versionNumber < targetVersionNumber {
|
||||||
|
return false
|
||||||
|
} else { // unchecked case, in normal, the goctl version does not contains suffix in release.
|
||||||
|
return tag[versionTag] > tag[targetTag]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// version format: number[.number]*(-tag)
|
||||||
|
func convertVersion(version string) (versionNumber float64, tag string) {
|
||||||
|
splits := strings.Split(version, "-")
|
||||||
|
tag = strings.Join(splits[1:], "")
|
||||||
|
var flag bool
|
||||||
|
numberStr := strings.Map(func(r rune) rune {
|
||||||
|
if r >= '0' && r <= '9' {
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
if r == '.' {
|
||||||
|
if flag {
|
||||||
|
return '_'
|
||||||
|
}
|
||||||
|
flag = true
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
return '_'
|
||||||
|
}, splits[0])
|
||||||
|
numberStr = strings.ReplaceAll(numberStr, "_", "")
|
||||||
|
versionNumber, _ = json.Number(numberStr).Float64()
|
||||||
|
return
|
||||||
|
}
|
||||||
33
tools/goctl/internal/env/env_test.go
vendored
Normal file
33
tools/goctl/internal/env/env_test.go
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package env
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_convertVersion(t *testing.T) {
|
||||||
|
number, tag := convertVersion("1.1.10")
|
||||||
|
assert.Equal(t, 1.110, number)
|
||||||
|
assert.Equal(t, "", tag)
|
||||||
|
|
||||||
|
number, tag = convertVersion("0.1.11")
|
||||||
|
assert.Equal(t, 0.111, number)
|
||||||
|
assert.Equal(t, "", tag)
|
||||||
|
|
||||||
|
number, tag = convertVersion("1.11-pre")
|
||||||
|
assert.Equal(t, 1.11, number)
|
||||||
|
assert.Equal(t, "pre", tag)
|
||||||
|
|
||||||
|
number, tag = convertVersion("1.11-beta-v1")
|
||||||
|
assert.Equal(t, 1.11, number)
|
||||||
|
assert.Equal(t, "betav1", tag)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_IsVersionGatherThan(t *testing.T) {
|
||||||
|
assert.False(t, IsVersionGatherThan("0.11", "1.1"))
|
||||||
|
assert.True(t, IsVersionGatherThan("0.112", "0.1"))
|
||||||
|
assert.True(t, IsVersionGatherThan("1.1.10", "1.0.111"))
|
||||||
|
assert.True(t, IsVersionGatherThan("1.1.10", "1.1.10-pre"))
|
||||||
|
assert.True(t, IsVersionGatherThan("1.1.11-pre", "1.1.10"))
|
||||||
|
}
|
||||||
@@ -49,10 +49,10 @@ goctl model 为go-zero下的工具模块中的组件之一,目前支持识别m
|
|||||||
userRowsExpectAutoSet = strings.Join(stringx.Remove(userFieldNames, "id", "create_time", "update_time"), ",")
|
userRowsExpectAutoSet = strings.Join(stringx.Remove(userFieldNames, "id", "create_time", "update_time"), ",")
|
||||||
userRowsWithPlaceHolder = strings.Join(stringx.Remove(userFieldNames, "id", "create_time", "update_time"), "=?,") + "=?"
|
userRowsWithPlaceHolder = strings.Join(stringx.Remove(userFieldNames, "id", "create_time", "update_time"), "=?,") + "=?"
|
||||||
|
|
||||||
cacheUserPrefix = "cache#User#user#"
|
cacheUserPrefix = "cache:User:user:"
|
||||||
cacheUserNamePrefix = "cache#User#name#"
|
cacheUserNamePrefix = "cache:User:name:"
|
||||||
cacheUserMobilePrefix = "cache#User#mobile#"
|
cacheUserMobilePrefix = "cache:User:mobile:"
|
||||||
cacheUserIdPrefix = "cache#User#id#"
|
cacheUserIdPrefix = "cache:User:id:"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@@ -349,7 +349,8 @@ OPTIONS:
|
|||||||
目前,我认为除了基本的CURD外,其他的代码均属于<i>业务型</i>代码,这个我觉得开发人员根据业务需要进行编写更好。
|
目前,我认为除了基本的CURD外,其他的代码均属于<i>业务型</i>代码,这个我觉得开发人员根据业务需要进行编写更好。
|
||||||
|
|
||||||
# 类型转换规则
|
# 类型转换规则
|
||||||
| mysql dataType | golang dataType | golang dataType(if null&&default null) |
|
|
||||||
|
| mysql dataType | golang dataType | golang Null dataType |
|
||||||
|----------------|-----------------|----------------------------------------|
|
|----------------|-----------------|----------------------------------------|
|
||||||
| bool | int64 | sql.NullInt64 |
|
| bool | int64 | sql.NullInt64 |
|
||||||
| boolean | int64 | sql.NullInt64 |
|
| boolean | int64 | sql.NullInt64 |
|
||||||
|
|||||||
@@ -17,14 +17,16 @@ CREATE TABLE `user`
|
|||||||
UNIQUE KEY `mobile_index` (`mobile`)
|
UNIQUE KEY `mobile_index` (`mobile`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||||
|
|
||||||
CREATE TABLE `student` (
|
CREATE TABLE `student`
|
||||||
`id` bigint NOT NULL AUTO_INCREMENT,
|
(
|
||||||
`class` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
|
`id` bigint NOT NULL,
|
||||||
`name` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
|
`class` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
|
||||||
`age` tinyint DEFAULT NULL,
|
`name` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
|
||||||
`score` float(10,0) DEFAULT NULL,
|
`age` tinyint DEFAULT NULL,
|
||||||
|
`score` float(10, 0
|
||||||
|
) DEFAULT NULL,
|
||||||
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
`update_time` timestamp NULL DEFAULT NULL,
|
`update_time` timestamp NULL DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
UNIQUE KEY `class_name_index` (`class`,`name`)
|
UNIQUE KEY `class_name_index` (`class`,`name`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
|
||||||
@@ -180,6 +180,7 @@ func convertColumns(columns []*parser.Column, primaryColumn string) (Primary, ma
|
|||||||
var (
|
var (
|
||||||
primaryKey Primary
|
primaryKey Primary
|
||||||
fieldM = make(map[string]*Field)
|
fieldM = make(map[string]*Field)
|
||||||
|
log = console.NewColorConsole()
|
||||||
)
|
)
|
||||||
|
|
||||||
for _, column := range columns {
|
for _, column := range columns {
|
||||||
@@ -194,8 +195,12 @@ func convertColumns(columns []*parser.Column, primaryColumn string) (Primary, ma
|
|||||||
|
|
||||||
if column.Constraint != nil {
|
if column.Constraint != nil {
|
||||||
comment = column.Constraint.Comment
|
comment = column.Constraint.Comment
|
||||||
isDefaultNull = !column.Constraint.HasDefaultValue
|
isDefaultNull = !column.Constraint.NotNull
|
||||||
if column.Name == primaryColumn && column.Constraint.AutoIncrement {
|
if !column.Constraint.NotNull && column.Constraint.HasDefaultValue {
|
||||||
|
isDefaultNull = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if column.Name == primaryColumn {
|
||||||
isDefaultNull = false
|
isDefaultNull = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,6 +210,16 @@ func convertColumns(columns []*parser.Column, primaryColumn string) (Primary, ma
|
|||||||
return Primary{}, nil, err
|
return Primary{}, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if column.Constraint != nil {
|
||||||
|
if column.Name == primaryColumn {
|
||||||
|
if !column.Constraint.AutoIncrement && dataType == "int64" {
|
||||||
|
log.Warning("%s: The primary key is recommended to add constraint `AUTO_INCREMENT`", column.Name)
|
||||||
|
}
|
||||||
|
} else if column.Constraint.NotNull && !column.Constraint.HasDefaultValue {
|
||||||
|
log.Warning("%s: The column is recommended to add constraint `DEFAULT`", column.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var field Field
|
var field Field
|
||||||
field.Name = stringx.From(column.Name)
|
field.Name = stringx.From(column.Name)
|
||||||
field.DataType = dataType
|
field.DataType = dataType
|
||||||
|
|||||||
Reference in New Issue
Block a user