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 }