From 143dd2b782b8bccb2575c516f0623aa05c4c130e Mon Sep 17 00:00:00 2001 From: testap92 Date: Tue, 12 Jul 2022 00:38:31 +0200 Subject: [PATCH 1/2] fix --- go.mod | 3 +++ go.sum | 31 +++++++++++++++++++++++++++++++ sqlorm/sql_test.go | 38 -------------------------------------- 3 files changed, 34 insertions(+), 38 deletions(-) create mode 100644 go.mod create mode 100644 go.sum delete mode 100644 sqlorm/sql_test.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..6c859d8 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gorm2sql + +go 1.18 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..3b815a4 --- /dev/null +++ b/go.sum @@ -0,0 +1,31 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/fatih/astrewrite v0.0.0-20191207154002-9094e544fcef h1:NQhozma2hi4BWW5q0qxka4G3bRNf+P/UgdmAVahUabM= +github.com/fatih/astrewrite v0.0.0-20191207154002-9094e544fcef/go.mod h1:Q9oPjZxY7Z0tvrD5KtBTVLiSwATtmhafFD/Lb0fyzOk= +github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/liudanking/gorm2sql v0.0.0-20180430122841-1fe6dd257bc8 h1:lk+c+Nzh7NXqnDFt12X/3TeopSC8r6yf08aMGvadpu8= +github.com/liudanking/gorm2sql v0.0.0-20180430122841-1fe6dd257bc8/go.mod h1:1uODrMofyIixSegpoky/iL/Ucq36/avOPlaYVzXQe20= +github.com/liudanking/goutil v0.0.0-20211122055725-7ad7ea12639e h1:IPkJtKO7BDvGlaCNfn2g6haZWh59Jq3PCbYMxN2nqlE= +github.com/liudanking/goutil v0.0.0-20211122055725-7ad7ea12639e/go.mod h1:4frXrTMke53Gd1N+bTWU8+oB8mnv0AAh0qIxmdKFMms= +github.com/pinzolo/casee v1.0.0 h1:IAgq79IXZxacw9Gt9W+Nlq0TZagANOFcDP53KWlU4us= +github.com/pinzolo/casee v1.0.0/go.mod h1:DDCwVFkYQJTGR9Un3KNuxe8gIP+Hw/y+CI+/AQwTu9Y= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/urfave/cli v1.22.9 h1:cv3/KhXGBGjEXLC4bH0sLuJ9BewaAbpk5oyMOveu4pw= +github.com/urfave/cli v1.22.9/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/sqlorm/sql_test.go b/sqlorm/sql_test.go deleted file mode 100644 index ff4e655..0000000 --- a/sqlorm/sql_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package sqlorm - -import ( - "backend/cdmake/program" - "go/parser" - "go/token" - "io/ioutil" - - "testing" -) - -func TestGenerateCreateTableSql(t *testing.T) { - fset := token.NewFileSet() - data, err := ioutil.ReadFile("../testdata/sqlmodel/user.go") - if err != nil { - t.Fatal(err) - } - f, err := parser.ParseFile(fset, "model.go", string(data), parser.ParseComments) - if err != nil { - t.Fatal(err) - } - - typeSpec, err := program.GetStructByName(f, "UserEmail") - if err != nil { - t.Fatal(err) - } - - ms, err := NewSqlGenerator(typeSpec) - if err != nil { - t.Fatal(err) - } - sql, err := ms.GetCreateTableSql() - if err != nil { - t.Fatal(err) - } - - t.Logf("sql:\n%s", sql) -} From 8552b4658831ae948ce4da88ced59653003ba536 Mon Sep 17 00:00:00 2001 From: testap92 Date: Tue, 12 Jul 2022 00:45:16 +0200 Subject: [PATCH 2/2] fix2 --- go.mod | 21 ++++++++++++++++++++- sqlorm/sql.go | 31 ++++++++++++++++++++++++------- sqlorm/sql_command.go | 8 +++++++- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 6c859d8..5b2b355 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,22 @@ -module gorm2sql +module github.com/testap92/gorm2sql go 1.18 + +require ( + github.com/fatih/astrewrite v0.0.0-20191207154002-9094e544fcef + github.com/fatih/structtag v1.2.0 + github.com/liudanking/gorm2sql v0.0.0-20180430122841-1fe6dd257bc8 + github.com/liudanking/goutil v0.0.0-20211122055725-7ad7ea12639e + github.com/pinzolo/casee v1.0.0 + github.com/urfave/cli v1.22.9 + golang.org/x/tools v0.1.11 +) + +require ( + github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect + github.com/fatih/camelcase v1.0.0 // indirect + github.com/russross/blackfriday/v2 v2.0.1 // indirect + github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect +) diff --git a/sqlorm/sql.go b/sqlorm/sql.go index 83fc2d8..d3b9ad5 100644 --- a/sqlorm/sql.go +++ b/sqlorm/sql.go @@ -15,19 +15,21 @@ import ( ) type SqlGenerator struct { - structName string - modelType *ast.StructType + structName string + modelType *ast.StructType + customTableName string } -func NewSqlGenerator(typeSpec *ast.TypeSpec) (*SqlGenerator, error) { +func NewSqlGenerator(typeSpec *ast.TypeSpec, tableName string) (*SqlGenerator, error) { structType, ok := typeSpec.Type.(*ast.StructType) if !ok { return nil, errors.New("typeSpec is not struct type") } return &SqlGenerator{ - structName: typeSpec.Name.Name, - modelType: structType, + structName: typeSpec.Name.Name, + modelType: structType, + customTableName: tableName, }, nil } @@ -137,6 +139,9 @@ func (ms *SqlGenerator) getStructFieds(node ast.Node) []*ast.Field { } func (ms *SqlGenerator) tableName() string { + if len(ms.customTableName) > 0 { + return ms.customTableName + } return casee.ToSnakeCase(ms.structName) } @@ -172,7 +177,14 @@ func generateSqlTag(field *ast.Field) (string, error) { autoIncrease = true } - sqlType, err = mysqlTag(field, size, autoIncrease) + decimalStr := "" + if value, ok := sqlSettings["TYPE"]; ok { + if strings.Contains(value, "decimal(") { + decimalStr = value + } + } + + sqlType, err = mysqlTag(field, size, autoIncrease, decimalStr) if err != nil { log.Warning("get mysql field tag failed:%v", err) return "", err @@ -215,7 +227,7 @@ func isPrimaryKey(field *ast.Field) bool { return false } -func mysqlTag(field *ast.Field, size int, autoIncrease bool) (string, error) { +func mysqlTag(field *ast.Field, size int, autoIncrease bool, decimalType string) (string, error) { typeName := "" switch t := field.Type.(type) { case *ast.Ident: @@ -248,6 +260,11 @@ func mysqlTag(field *ast.Field, size int, autoIncrease bool) (string, error) { return "longtext", nil case "Time": return "datetime", nil + case "Decimal": + if len(decimalType) > 0 { + return decimalType, nil + } + return "decimal(8,2)", nil default: return "", errors.New(fmt.Sprintf("type %s not supported", typeName)) diff --git a/sqlorm/sql_command.go b/sqlorm/sql_command.go index 22f833a..49e0a40 100644 --- a/sqlorm/sql_command.go +++ b/sqlorm/sql_command.go @@ -35,6 +35,10 @@ func SqlCommand() cli.Command { Name: "out, o", Usage: "output file", }, + cli.StringFlag{ + Name: "table_name, t", + Usage: "custom table name", + }, }, Action: SqlCommandAction, } @@ -66,6 +70,8 @@ func SqlCommandAction(c *cli.Context) error { return match } + tableName := c.String("table_name") + var types []*ast.TypeSpec if !fi.IsDir() { fset := token.NewFileSet() @@ -109,7 +115,7 @@ func SqlCommandAction(c *cli.Context) error { sqls := []string{} for _, typ := range types { - ms, err := NewSqlGenerator(typ) + ms, err := NewSqlGenerator(typ, tableName) if err != nil { log.Warning("create model struct failed:%v", err) return err