Skip to content

Commit

Permalink
feature model fix (zeromicro#296)
Browse files Browse the repository at this point in the history
* add raw stirng quote for sql field

* remove unused code
  • Loading branch information
anqiansong authored Dec 21, 2020
1 parent 097f688 commit a3b525b
Show file tree
Hide file tree
Showing 21 changed files with 1,127 additions and 59 deletions.
4 changes: 2 additions & 2 deletions tools/goctl/model/sql/builderx/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ func FieldNames(in interface{}) []string {
// gets us a StructField
fi := typ.Field(i)
if tagv := fi.Tag.Get(dbTag); tagv != "" {
out = append(out, tagv)
out = append(out, fmt.Sprintf("`%v`", tagv))
} else {
out = append(out, fi.Name)
out = append(out, fmt.Sprintf("`%v`", fi.Name))
}
}
return out
Expand Down
11 changes: 5 additions & 6 deletions tools/goctl/model/sql/builderx/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@ var userFields = FieldNames(User{})
func TestFieldNames(t *testing.T) {
var u User
out := FieldNames(&u)
fmt.Println(out)
actual := []string{"id", "user_name", "sex", "uuid", "age"}
actual := []string{"`id`", "`user_name`", "`sex`", "`uuid`", "`age`"}
assert.Equal(t, out, actual)
}

Expand All @@ -54,7 +53,7 @@ func TestBuilderSql(t *testing.T) {
sql, args, err := builder.Select(fields...).From("user").Where(eq).ToSQL()
fmt.Println(sql, args, err)

actualSql := "SELECT id,user_name,sex,uuid,age FROM user WHERE id=?"
actualSql := "SELECT `id`,`user_name`,`sex`,`uuid`,`age` FROM user WHERE id=?"
actualArgs := []interface{}{"123123"}
assert.Equal(t, sql, actualSql)
assert.Equal(t, args, actualArgs)
Expand All @@ -68,7 +67,7 @@ func TestBuildSqlDefaultValue(t *testing.T) {
sql, args, err := builder.Select(userFields...).From("user").Where(eq).ToSQL()
fmt.Println(sql, args, err)

actualSql := "SELECT id,user_name,sex,uuid,age FROM user WHERE age=? AND user_name=?"
actualSql := "SELECT `id`,`user_name`,`sex`,`uuid`,`age` FROM user WHERE age=? AND user_name=?"
actualArgs := []interface{}{0, ""}
assert.Equal(t, sql, actualSql)
assert.Equal(t, args, actualArgs)
Expand All @@ -83,7 +82,7 @@ func TestBuilderSqlIn(t *testing.T) {
sql, args, err := builder.Select(userFields...).From("user").Where(in).And(gtU).ToSQL()
fmt.Println(sql, args, err)

actualSql := "SELECT id,user_name,sex,uuid,age FROM user WHERE id IN (?,?,?) AND age>?"
actualSql := "SELECT `id`,`user_name`,`sex`,`uuid`,`age` FROM user WHERE id IN (?,?,?) AND age>?"
actualArgs := []interface{}{"1", "2", "3", 18}
assert.Equal(t, sql, actualSql)
assert.Equal(t, args, actualArgs)
Expand All @@ -94,7 +93,7 @@ func TestBuildSqlLike(t *testing.T) {
sql, args, err := builder.Select(userFields...).From("user").Where(like).ToSQL()
fmt.Println(sql, args, err)

actualSql := "SELECT id,user_name,sex,uuid,age FROM user WHERE name LIKE ?"
actualSql := "SELECT `id`,`user_name`,`sex`,`uuid`,`age` FROM user WHERE name LIKE ?"
actualArgs := []interface{}{"%wang%"}
assert.Equal(t, sql, actualSql)
assert.Equal(t, args, actualArgs)
Expand Down
12 changes: 9 additions & 3 deletions tools/goctl/model/sql/example/makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
#!/bin/bash

# generate model with cache from ddl
fromDDL:
goctl model mysql ddl -src="./sql/*.sql" -dir="./sql/model/user" -cache
fromDDLWithCache:
goctl template clean;
goctl model mysql ddl -src="./sql/*.sql" -dir="./sql/model/cache/user" -cache;

fromDDLWithoutCache:
goctl template clean;
goctl model mysql ddl -src="./sql/*.sql" -dir="./sql/model/nocache/user";


# generate model with cache from data source
Expand All @@ -12,4 +17,5 @@ datasource=127.0.0.1:3306
database=gozero

fromDataSource:
goctl model mysql datasource -url="$(user):$(password)@tcp($(datasource))/$(database)" -table="*" -dir ./model/cache -c -style gozero
goctl template clean;
goctl model mysql datasource -url="$(user):$(password)@tcp($(datasource))/$(database)" -table="*" -dir ./model/cache -c -style gozero;
2 changes: 1 addition & 1 deletion tools/goctl/model/sql/gen/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func genDelete(table Table, withCache bool) (string, string, error) {
"lowerStartCamelPrimaryKey": stringx.From(table.PrimaryKey.Name.ToCamel()).Untitle(),
"dataType": table.PrimaryKey.DataType,
"keys": strings.Join(keySet.KeysStr(), "\n"),
"originalPrimaryKey": table.PrimaryKey.Name.Source(),
"originalPrimaryKey": wrapWithRawString(table.PrimaryKey.Name.Source()),
"keyValues": strings.Join(keyVariableSet.KeysStr(), ", "),
})
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion tools/goctl/model/sql/gen/findone.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ func genFindOne(table Table, withCache bool) (string, string, error) {
"withCache": withCache,
"upperStartCamelObject": camel,
"lowerStartCamelObject": stringx.From(camel).Untitle(),
"originalPrimaryKey": table.PrimaryKey.Name.Source(),
"originalPrimaryKey": wrapWithRawString(table.PrimaryKey.Name.Source()),
"lowerStartCamelPrimaryKey": stringx.From(table.PrimaryKey.Name.ToCamel()).Untitle(),
"dataType": table.PrimaryKey.DataType,
"cacheKey": table.CacheKey[table.PrimaryKey.Name.Source()].KeyExpression,
Expand Down
4 changes: 2 additions & 2 deletions tools/goctl/model/sql/gen/findonebyfield.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func genFindOneByField(table Table, withCache bool) (*findOneCode, error) {
"lowerStartCamelObject": stringx.From(camelTableName).Untitle(),
"lowerStartCamelField": stringx.From(camelFieldName).Untitle(),
"upperStartCamelPrimaryKey": table.PrimaryKey.Name.ToCamel(),
"originalField": field.Name.Source(),
"originalField": wrapWithRawString(field.Name.Source()),
})
if err != nil {
return nil, err
Expand Down Expand Up @@ -82,7 +82,7 @@ func genFindOneByField(table Table, withCache bool) (*findOneCode, error) {
"upperStartCamelObject": camelTableName,
"primaryKeyLeft": table.CacheKey[table.PrimaryKey.Name.Source()].Left,
"lowerStartCamelObject": stringx.From(camelTableName).Untitle(),
"originalPrimaryField": table.PrimaryKey.Name.Source(),
"originalPrimaryField": wrapWithRawString(table.PrimaryKey.Name.Source()),
})
if err != nil {
return nil, err
Expand Down
20 changes: 17 additions & 3 deletions tools/goctl/model/sql/gen/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@ import (
const (
pwd = "."
createTableFlag = `(?m)^(?i)CREATE\s+TABLE` // ignore case
NamingLower = "lower"
NamingCamel = "camel"
NamingSnake = "snake"
)

type (
Expand Down Expand Up @@ -280,3 +277,20 @@ func (g *defaultGenerator) genModel(in parser.Table, withCache bool) (string, er

return output.String(), nil
}

func wrapWithRawString(v string) string {
if v == "`" {
return v
}

if !strings.HasPrefix(v, "`") {
v = "`" + v
}

if !strings.HasSuffix(v, "`") {
v = v + "`"
} else if len(v) == 1 {
v = v + "`"
}
return v
}
34 changes: 34 additions & 0 deletions tools/goctl/model/sql/gen/gen_test.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package gen

import (
"database/sql"
"os"
"path/filepath"
"strings"
"testing"
"time"

"github.com/stretchr/testify/assert"
"github.com/tal-tech/go-zero/core/logx"
"github.com/tal-tech/go-zero/core/stringx"
"github.com/tal-tech/go-zero/tools/goctl/config"
"github.com/tal-tech/go-zero/tools/goctl/model/sql/builderx"
)

var (
Expand Down Expand Up @@ -79,3 +84,32 @@ func TestNamingModel(t *testing.T) {
return err == nil
}())
}

func TestWrapWithRawString(t *testing.T) {
assert.Equal(t, "``", wrapWithRawString(""))
assert.Equal(t, "``", wrapWithRawString("``"))
assert.Equal(t, "`a`", wrapWithRawString("a"))
assert.Equal(t, "` `", wrapWithRawString(" "))
}

func TestFields(t *testing.T) {
type Student struct {
Id int64 `db:"id"`
Name string `db:"name"`
Age sql.NullInt64 `db:"age"`
Score sql.NullFloat64 `db:"score"`
CreateTime time.Time `db:"create_time"`
UpdateTime sql.NullTime `db:"update_time"`
}
var (
studentFieldNames = builderx.FieldNames(&Student{})
studentRows = strings.Join(studentFieldNames, ",")
studentRowsExpectAutoSet = strings.Join(stringx.Remove(studentFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
studentRowsWithPlaceHolder = strings.Join(stringx.Remove(studentFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
)

assert.Equal(t, []string{"`id`", "`name`", "`age`", "`score`", "`create_time`", "`update_time`"}, studentFieldNames)
assert.Equal(t, "`id`,`name`,`age`,`score`,`create_time`,`update_time`", studentRows)
assert.Equal(t, "`name`,`age`,`score`", studentRowsExpectAutoSet)
assert.Equal(t, "`name`=?,`age`=?,`score`=?", studentRowsWithPlaceHolder)
}
2 changes: 1 addition & 1 deletion tools/goctl/model/sql/gen/new.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func genNew(table Table, withCache bool) (string, error) {
output, err := util.With("new").
Parse(text).
Execute(map[string]interface{}{
"table": table.Name.Source(),
"table": wrapWithRawString(table.Name.Source()),
"withCache": withCache,
"upperStartCamelObject": table.Name.ToCamel(),
})
Expand Down
2 changes: 1 addition & 1 deletion tools/goctl/model/sql/gen/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func genUpdate(table Table, withCache bool) (string, string, error) {
"primaryCacheKey": table.CacheKey[table.PrimaryKey.Name.Source()].DataKeyExpression,
"primaryKeyVariable": table.CacheKey[table.PrimaryKey.Name.Source()].Variable,
"lowerStartCamelObject": stringx.From(camelTableName).Untitle(),
"originalPrimaryKey": table.PrimaryKey.Name.Source(),
"originalPrimaryKey": wrapWithRawString(table.PrimaryKey.Name.Source()),
"expressionValues": strings.Join(expressionValues, ", "),
})
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion tools/goctl/model/sql/gen/vars.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func genVars(table Table, withCache bool) (string, error) {
"upperStartCamelObject": camel,
"cacheKeys": strings.Join(keys, "\n"),
"autoIncrement": table.PrimaryKey.AutoIncrement,
"originalPrimaryKey": table.PrimaryKey.Name.Source(),
"originalPrimaryKey": wrapWithRawString(table.PrimaryKey.Name.Source()),
"withCache": withCache,
})
if err != nil {
Expand Down
34 changes: 0 additions & 34 deletions tools/goctl/model/sql/model/ddlmodel.go

This file was deleted.

10 changes: 6 additions & 4 deletions tools/goctl/model/sql/template/vars.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package template

var Vars = `
import "fmt"

var Vars = fmt.Sprintf(`
var (
{{.lowerStartCamelObject}}FieldNames = builderx.FieldNames(&{{.upperStartCamelObject}}{})
{{.lowerStartCamelObject}}Rows = strings.Join({{.lowerStartCamelObject}}FieldNames, ",")
{{.lowerStartCamelObject}}RowsExpectAutoSet = strings.Join(stringx.Remove({{.lowerStartCamelObject}}FieldNames, {{if .autoIncrement}}"{{.originalPrimaryKey}}",{{end}} "create_time", "update_time"), ",")
{{.lowerStartCamelObject}}RowsWithPlaceHolder = strings.Join(stringx.Remove({{.lowerStartCamelObject}}FieldNames, "{{.originalPrimaryKey}}", "create_time", "update_time"), "=?,") + "=?"
{{.lowerStartCamelObject}}RowsExpectAutoSet = strings.Join(stringx.Remove({{.lowerStartCamelObject}}FieldNames, {{if .autoIncrement}}"{{.originalPrimaryKey}}",{{end}} "%screate_time%s", "%supdate_time%s"), ",")
{{.lowerStartCamelObject}}RowsWithPlaceHolder = strings.Join(stringx.Remove({{.lowerStartCamelObject}}FieldNames, "{{.originalPrimaryKey}}", "%screate_time%s", "%supdate_time%s"), "=?,") + "=?"
{{if .withCache}}{{.cacheKeys}}{{end}}
)
`
`, "`", "`", "`", "`", "`", "`", "`", "`")
Loading

0 comments on commit a3b525b

Please sign in to comment.