烙印99
Statement要获取所有表名,您必须将它们从返回的 by中拉出Parse,可能使用反射。如果您运行以下代码:stmt, _ := sqlparser.Parse("insert into my_table set my_column=1")fmt.Printf("%#v\n", stmt)你得到输出(为了便于阅读而缩进):&sqlparser.Insert{ Action:"insert", Comments:sqlparser.Comments(nil), Ignore:"", Table:sqlparser.TableName{ Name:sqlparser.TableIdent{v:"my_table"}, Qualifier:sqlparser.TableIdent{v:""} }, Partitions:sqlparser.Partitions(nil), Columns:sqlparser.Columns{sqlparser.ColIdent{_:[0]struct { _ []uint8 }{}, val:"my_column", lowered:""}}, Rows:sqlparser.Values{sqlparser.ValTuple{(*sqlparser.SQLVal)(0xc00000a0c0)}}, OnDup:sqlparser.OnDup(nil)}如您所见,它包含一个类型的(子)字段TableIdent,其中包含语句中请求的表。
qq_遁去的一_1
原始片段还返回了表的别名。例如select * from my_table as mt join other_table using(my_key)original snippet returns: [my_table, mt, other_table]new snippet returns: [my_table, other_table]rob74 的原始片段:play.golang.org/p/B31wr2w1AL8package mainimport ( "fmt" "github.com/xwb1989/sqlparser" "reflect")func main() { stmt, _ := sqlparser.Parse("select * from my_table as mt join other_table using(my_key)") var tables []string tables = getTableNames(reflect.Indirect(reflect.ValueOf(stmt)), tables, 0, false) fmt.Printf("%s", tables)}func getTableNames(v reflect.Value, tables []string, level int, isTable bool) []string { switch v.Kind() { case reflect.Struct: if v.Type().Name() == "TableIdent" { // if this is a TableIdent struct, extract the table name tableName := v.FieldByName("v").String() if tableName != "" && isTable{ tables = append(tables, tableName) } } else { // otherwise enumerate all fields of the struct and process further for i := 0; i < v.NumField(); i++ { tables = getTableNames(reflect.Indirect(v.Field(i)), tables, level+1, isTable) } } case reflect.Array, reflect.Slice: for i := 0; i < v.Len(); i++ { // enumerate all elements of an array/slice and process further tables = getTableNames(reflect.Indirect(v.Index(i)), tables, level+1, isTable) } case reflect.Interface: if v.Type().Name() == "SimpleTableExpr" { isTable = true } // get the actual object that satisfies an interface and process further tables = getTableNames(reflect.Indirect(reflect.ValueOf(v.Interface())), tables, level+1, isTable) } return tables}