본문 바로가기

Slack 채널 정리

go template 이용한 간단한 소스 제너레이터

DB 컬럼명으로 새로운 프레임워크의 dbio 에서 사용할 insert, update 구문을 만들어주는 간단한 기능을 go 의 template 를 이용해서 만들어보았습니다. go template 기능 처음 사용해서 급조한거라 코드는 지저분하지만 ...

package main

import (
  "os"
  "text/template"
  "tzara/util"
  "bufio"
)

// exec : % go run insert_mdm.go MDM_CNTI

type Query struct {
  TableName  string
  Cols, Vals []string
  Where     string
}

func sliceToCamel(snake []string) []string {
  camel := make([]string, 0, len(snake))
  for _, a := range snake {
    camel = append(camel, util.ToCamel(a))
  }

  return camel
}

func sliceUpdate(snake []string) []string {
  camel := make([]string, 0, len(snake))
  for _, a := range snake {
    camel = append(camel, genSetStr(a))
  }

  return camel
}

func genSetStr(snake string) string {
  return snake + " = @{" + util.ToCamel(snake) + "}"
}

func readCols(path string) ([]string) {
  file, _ := os.Open(path)
  defer file.Close()

  var lines []string
  scanner := bufio.NewScanner(file)
  for scanner.Scan() {
    lines = append(lines, scanner.Text())
  }
  return lines
}

func main() {
  if len(os.Args) < 2 {
    panic("argument error")
  }

  tableName := os.Args[1]
  colsArr := readCols("D:/" + tableName + ".txt")

  insertSql := &Query{
    TableName: tableName,
    Cols:      colsArr,
    Vals:      sliceToCamel(colsArr),
  }

  selectSql := &Query{
    TableName: tableName,
    Cols:      colsArr,
    Where:     genSetStr(colsArr[0]),
  }

  updateSql := &Query{
    TableName: tableName,
    Cols:      sliceUpdate(colsArr[1:]),
    Where:     genSetStr(colsArr[0]),
  }

  tmplInsertSql := `
INSERT INTO {{ .TableName }} (
{{- range $i, $e := .Cols }}
  {{if $i}}, {{end}}{{$e}}
{{- end }}
) VALUES (
{{- range $i, $e := .Vals }}
  {{if $i}}, {{end}}@{{"{"}}{{$e}}{{"}"}}
{{- end}}
)
`

  tmplUpdateSql := `
UPDATE {{ .TableName }}
SET
{{- range $i, $e := .Cols }}
  {{if $i}}, {{end}}{{$e}}
{{- end }}
WHERE
  {{ .Where }}
`

  tmplSelectSql := `
SELECT
{{- range $i, $e := .Cols }}
  {{if $i}}, {{end}}{{$e}}
{{- end }}
FROM {{ .TableName }}
WHERE
  {{ .Where }}
`
  tmpl := template.Must(template.New("test").Parse(tmplInsertSql))
  tmpl.Execute(os.Stdout, insertSql)

  tmpl = template.Must(template.New("test").Parse(tmplUpdateSql))
  tmpl.Execute(os.Stdout, updateSql)

  tmpl = template.Must(template.New("test").Parse(tmplSelectSql))
  tmpl.Execute(os.Stdout, selectSql)
}

'Slack 채널 정리' 카테고리의 다른 글

groovy - snake to camel  (0) 2019.11.26
vim 에서 snake, camel 변환  (0) 2019.11.26
여러 엑셀 파일의 sheet 통합하기  (0) 2019.11.26
[Go]Snake to Camel  (0) 2019.11.26
파일명의 접두어 일괄 바꾸기  (0) 2019.11.26