github.com/unionj-cloud/go-doudou@v1.3.8-0.20221011095552-0088008e5b31/cmd/internal/ddl/codegen/daosql.go (about)

     1  package codegen
     2  
     3  import (
     4  	"bytes"
     5  	"github.com/iancoleman/strcase"
     6  	log "github.com/sirupsen/logrus"
     7  	"github.com/unionj-cloud/go-doudou/cmd/internal/astutils"
     8  	"github.com/unionj-cloud/go-doudou/cmd/internal/ddl/table"
     9  	"github.com/unionj-cloud/go-doudou/version"
    10  	"os"
    11  	"path/filepath"
    12  	"strings"
    13  	"text/template"
    14  )
    15  
    16  var daosqltmpl = `{{` + "`" + `{{` + "`" + `}}define "NoneZeroSet"{{` + "`" + `}}` + "`" + `}}
    17  	{{- range $i, $co := .UpdateColumns}}
    18  	{{` + "`" + `{{` + "`" + `}}- if .{{$co.Meta.Name}}{{` + "`" + `}}` + "`" + `}}
    19  	` + "`" + `{{$co.Name}}` + "`" + `=:{{$co.Name}},
    20  	{{` + "`" + `{{` + "`" + `}}- end{{` + "`" + `}}` + "`" + `}}
    21  	{{- end}}
    22  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
    23  
    24  {{` + "`" + `{{` + "`" + `}}define "Insert{{.DomainName}}"{{` + "`" + `}}` + "`" + `}}
    25  INSERT INTO ` + "`" + `{{.Schema}}` + "`" + `.` + "`" + `{{.TableName}}` + "`" + `
    26  ({{- range $i, $co := .InsertColumns}}
    27  {{- if $i}},{{end}}
    28  ` + "`" + `{{$co.Name}}` + "`" + `
    29  {{- end }})
    30  VALUES ({{- range $i, $co := .InsertColumns}}
    31  	   {{- if $i}},{{end}}
    32  	   :{{$co.Name}}
    33  	   {{- end }})
    34  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
    35  
    36  {{` + "`" + `{{` + "`" + `}}define "Update{{.DomainName}}"{{` + "`" + `}}` + "`" + `}}
    37  UPDATE ` + "`" + `{{.Schema}}` + "`" + `.` + "`" + `{{.TableName}}` + "`" + `
    38  SET
    39  	{{- range $i, $co := .UpdateColumns}}
    40  	{{- if $i}},{{end}}
    41  	` + "`" + `{{$co.Name}}` + "`" + `=:{{$co.Name}}
    42  	{{- end }}
    43  WHERE
    44      ` + "`" + `{{.Pk.Name}}` + "`" + ` =:{{.Pk.Name}}
    45  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
    46  
    47  {{` + "`" + `{{` + "`" + `}}define "Update{{.DomainName}}NoneZero"{{` + "`" + `}}` + "`" + `}}
    48  UPDATE ` + "`" + `{{.Schema}}` + "`" + `.` + "`" + `{{.TableName}}` + "`" + `
    49  SET
    50      {{` + "`" + `{{` + "`" + `}}Eval "NoneZeroSet" . | TrimSuffix ","{{` + "`" + `}}` + "`" + `}}
    51  WHERE
    52      ` + "`" + `{{.Pk.Name}}` + "`" + `=:{{.Pk.Name}}
    53  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
    54  
    55  {{` + "`" + `{{` + "`" + `}}define "Upsert{{.DomainName}}"{{` + "`" + `}}` + "`" + `}}
    56  INSERT INTO ` + "`" + `{{.Schema}}` + "`" + `.` + "`" + `{{.TableName}}` + "`" + `
    57  ({{- range $i, $co := .InsertColumns}}
    58  {{- if $i}},{{end}}
    59  ` + "`" + `{{$co.Name}}` + "`" + `
    60  {{- end }})
    61  VALUES ({{- range $i, $co := .InsertColumns}}
    62          {{- if $i}},{{end}}
    63          :{{$co.Name}}
    64          {{- end }}) ON DUPLICATE KEY
    65  UPDATE
    66  		{{- range $i, $co := .UpdateColumns}}
    67  		{{- if $i}},{{end}}
    68  		` + "`" + `{{$co.Name}}` + "`" + `=:{{$co.Name}}
    69  		{{- end }}
    70  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
    71  
    72  {{` + "`" + `{{` + "`" + `}}define "Upsert{{.DomainName}}NoneZero"{{` + "`" + `}}` + "`" + `}}
    73  INSERT INTO ` + "`" + `{{.Schema}}` + "`" + `.` + "`" + `{{.TableName}}` + "`" + `
    74  ({{- range $i, $co := .InsertColumns}}
    75  {{- if $i}},{{end}}
    76  ` + "`" + `{{$co.Name}}` + "`" + `
    77  {{- end }})
    78  VALUES ({{- range $i, $co := .InsertColumns}}
    79          {{- if $i}},{{end}}
    80          :{{$co.Name}}
    81          {{- end }}) ON DUPLICATE KEY
    82  UPDATE
    83  		{{` + "`" + `{{` + "`" + `}}Eval "NoneZeroSet" . | TrimSuffix ","{{` + "`" + `}}` + "`" + `}}
    84  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
    85  
    86  {{` + "`" + `{{` + "`" + `}}define "Get{{.DomainName}}"{{` + "`" + `}}` + "`" + `}}
    87  select *
    88  from ` + "`" + `{{.Schema}}` + "`" + `.` + "`" + `{{.TableName}}` + "`" + `
    89  where ` + "`" + `{{.Pk.Name}}` + "`" + ` = ?
    90  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
    91  
    92  {{` + "`" + `{{` + "`" + `}}define "Update{{.DomainName}}s"{{` + "`" + `}}` + "`" + `}}
    93  UPDATE ` + "`" + `{{.Schema}}` + "`" + `.` + "`" + `{{.TableName}}` + "`" + `
    94  SET
    95  	{{- range $i, $co := .UpdateColumns}}
    96  	{{- if $i}},{{end}}
    97  	` + "`" + `{{$co.Name}}` + "`" + `=:{{$co.Name}}
    98  	{{- end }}
    99  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
   100  
   101  {{` + "`" + `{{` + "`" + `}}define "Update{{.DomainName}}sNoneZero"{{` + "`" + `}}` + "`" + `}}
   102  UPDATE ` + "`" + `{{.Schema}}` + "`" + `.` + "`" + `{{.TableName}}` + "`" + `
   103  SET
   104      {{` + "`" + `{{` + "`" + `}}Eval "NoneZeroSet" . | TrimSuffix ","{{` + "`" + `}}` + "`" + `}}
   105  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
   106  
   107  {{` + "`" + `{{` + "`" + `}}define "InsertIgnore{{.DomainName}}"{{` + "`" + `}}` + "`" + `}}
   108  INSERT IGNORE INTO ` + "`" + `{{.Schema}}` + "`" + `.` + "`" + `{{.TableName}}` + "`" + `
   109  ({{- range $i, $co := .InsertColumns}}
   110  {{- if $i}},{{end}}
   111  ` + "`" + `{{$co.Name}}` + "`" + `
   112  {{- end }})
   113  VALUES ({{- range $i, $co := .InsertColumns}}
   114  	   {{- if $i}},{{end}}
   115  	   :{{$co.Name}}
   116  	   {{- end }})
   117  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
   118  
   119  {{` + "`" + `{{` + "`" + `}}define "UpdateClause{{.DomainName}}"{{` + "`" + `}}` + "`" + `}}
   120  ON DUPLICATE KEY
   121  UPDATE
   122  		{{- range $i, $co := .UpdateColumns}}
   123  		{{- if $i}},{{end}}
   124  		` + "`" + `{{$co.Name}}` + "`" + `=VALUES({{$co.Name}})
   125  		{{- end }}
   126  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
   127  
   128  {{` + "`" + `{{` + "`" + `}}define "UpdateClauseSelect{{.DomainName}}"{{` + "`" + `}}` + "`" + `}}
   129  ON DUPLICATE KEY
   130  UPDATE
   131  		{{` + "`" + `{{` + "`" + `}}- range $i, $co := .Columns{{` + "`" + `}}` + "`" + `}}
   132  		{{` + "`" + `{{` + "`" + `}}- if $i{{` + "`" + `}}` + "`" + `}},{{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}
   133  		` + "`" + `{{` + "`" + `{{` + "`" + `}}$co{{` + "`" + `}}` + "`" + `}}` + "`" + `=VALUES({{` + "`" + `{{` + "`" + `}}$co{{` + "`" + `}}` + "`" + `}})
   134  		{{` + "`" + `{{` + "`" + `}}- end {{` + "`" + `}}` + "`" + `}}
   135  {{` + "`" + `{{` + "`" + `}}end{{` + "`" + `}}` + "`" + `}}`
   136  
   137  // GenDaoSQL generates sql statements used by dao layer
   138  func GenDaoSQL(domainpath string, t table.Table, folder ...string) error {
   139  	var (
   140  		err      error
   141  		daopath  string
   142  		f        *os.File
   143  		funcMap  map[string]interface{}
   144  		tpl      *template.Template
   145  		iColumns []table.Column
   146  		uColumns []table.Column
   147  		df       string
   148  		sqlBuf   bytes.Buffer
   149  	)
   150  	df = "dao"
   151  	if len(folder) > 0 {
   152  		df = folder[0]
   153  	}
   154  	daopath = filepath.Join(filepath.Dir(domainpath), df)
   155  	_ = os.MkdirAll(daopath, os.ModePerm)
   156  	daofile := filepath.Join(daopath, strings.ToLower(t.Meta.Name)+"daosql.go")
   157  	if _, err = os.Stat(daofile); os.IsNotExist(err) {
   158  		f, _ = os.Create(daofile)
   159  		defer f.Close()
   160  
   161  		funcMap = make(map[string]interface{})
   162  		funcMap["ToSnake"] = strcase.ToSnake
   163  		tpl, _ = template.New("daosql.tmpl").Funcs(funcMap).Parse(daosqltmpl)
   164  
   165  		for _, co := range t.Columns {
   166  			if !co.AutoSet {
   167  				iColumns = append(iColumns, co)
   168  			}
   169  			if !co.AutoSet && !co.Pk {
   170  				uColumns = append(uColumns, co)
   171  			}
   172  		}
   173  
   174  		var pkColumn table.Column
   175  		for _, co := range t.Columns {
   176  			if co.Pk {
   177  				pkColumn = co
   178  				break
   179  			}
   180  		}
   181  		_ = tpl.Execute(&sqlBuf, struct {
   182  			Schema        string
   183  			TableName     string
   184  			DomainName    string
   185  			InsertColumns []table.Column
   186  			UpdateColumns []table.Column
   187  			Pk            table.Column
   188  		}{
   189  			Schema:        os.Getenv("DB_SCHEMA"),
   190  			TableName:     t.Name,
   191  			DomainName:    t.Meta.Name,
   192  			InsertColumns: iColumns,
   193  			UpdateColumns: uColumns,
   194  			Pk:            pkColumn,
   195  		})
   196  		sqlStr := strings.TrimSpace(sqlBuf.String())
   197  		sqlStr = strings.ReplaceAll(sqlStr, "`", "`"+" + "+`"`+"`"+`"`+" + "+"`")
   198  		sqlBuf.Reset()
   199  		sqlBuf.WriteString(`/**
   200  * Generated by go-doudou ` + version.Release + `.
   201  * You can edit it as your need.
   202  */
   203  package dao
   204  `)
   205  		sqlBuf.WriteString("var " + strings.ToLower(t.Meta.Name) + "daosql=`" + sqlStr + "`\n")
   206  		astutils.FixImport(sqlBuf.Bytes(), daofile)
   207  	} else {
   208  		log.Warnf("file %s already exists", daofile)
   209  	}
   210  	return nil
   211  }