pingcap / parser

A MySQL Compatible SQL Parser
Apache License 2.0
1.4k stars 490 forks source link

How to beautify sql with this package ? #1374

Closed clearcodecn closed 2 years ago

clearcodecn commented 2 years ago

How to beautify sql with this package ?

tangenta commented 2 years ago

You can parse the SQL and restore it from an AST:

package main

import (
    "fmt"
    "strings"

    "github.com/pingcap/tidb/parser"
    "github.com/pingcap/tidb/parser/format"
    _ "github.com/pingcap/tidb/parser/test_driver"
)

func main() {
    p := parser.New()
    fmt.Println(beautify(p, "SeleCT  a, b from    t where ((c = 1));"))
}

func beautify(p *parser.Parser, sql string) string {
    stmt, _, err := p.ParseSQL(sql)
    if err != nil {
        panic(err)
    }
    var sb strings.Builder
    ctx := format.NewRestoreCtx(format.DefaultRestoreFlags, &sb)
    err = stmt[0].Restore(ctx)
    if err != nil {
        panic(err)
    }
    return sb.String()
}
clearcodecn commented 2 years ago

thanks.

morlay commented 2 years ago

@tangenta But github.com/pingcap/tidb/parser couldn't go get May consider remove this file https://github.com/pingcap/tidb/blob/master/parser/go.mod

sunyaf commented 1 year ago

You can parse the SQL and restore it from an AST:

package main

import (
  "fmt"
  "strings"

  "github.com/pingcap/tidb/parser"
  "github.com/pingcap/tidb/parser/format"
  _ "github.com/pingcap/tidb/parser/test_driver"
)

func main() {
  p := parser.New()
  fmt.Println(beautify(p, "SeleCT  a, b from    t where ((c = 1));"))
}

func beautify(p *parser.Parser, sql string) string {
  stmt, _, err := p.ParseSQL(sql)
  if err != nil {
      panic(err)
  }
  var sb strings.Builder
  ctx := format.NewRestoreCtx(format.DefaultRestoreFlags, &sb)
  err = stmt[0].Restore(ctx)
  if err != nil {
      panic(err)
  }
  return sb.String()
}

why THE result WITHOUT \n