第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

從 SQL 查詢中獲取表名

從 SQL 查詢中獲取表名

Go
不負(fù)相思意 2023-06-01 15:05:43
我正在使用golang SQL 解析器從實(shí)際的 SQL 查詢字符串中獲取查詢相關(guān)信息。我可以使用以下代碼找到查詢類型:queryType?:=?sqlparser.StmtType(sqlparser.Preview(sql)) fmt.Println(queryType)但我不確定如何從 sql 查詢中獲取實(shí)際的表名。文檔也不清楚。我從解析函數(shù)中得到的唯一信息是一條語句有人可以指導(dǎo)我如何使用 golang sqlparser 獲取此信息嗎?
查看完整描述

3 回答

?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊

Statement要獲取所有表名,您必須將它們從返回的 by中拉出Parse,可能使用反射。如果您運(yùn)行以下代碼:


stmt, _ := sqlparser.Parse("insert into my_table set my_column=1")

fmt.Printf("%#v\n", stmt)

你得到輸出(為了便于閱讀而縮進(jìn)):


&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)

}

如您所見,它包含一個(gè)類型的(子)字段TableIdent,其中包含語句中請(qǐng)求的表。


查看完整回答
反對(duì) 回復(fù) 2023-06-01
?
qq_遁去的一_1

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊

原始片段還返回了表的別名。例如


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/B31wr2w1AL8


package main


import (

? ? "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

}


查看完整回答
反對(duì) 回復(fù) 2023-06-01
?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊

我為 SQL 查詢編寫了一些字符串操作庫來獲取表名:


queryString := sqlstr.NewQueryString(`SELECT column_name(s)

FROM table1

LEFT JOIN table2

ON table1.column_name = table2.column_name;`)


tableNames := queryString.TableNames()


fmt.Println(tableNames)


// Output:

// [table1 table2]


查看完整回答
反對(duì) 回復(fù) 2023-06-01
  • 3 回答
  • 0 關(guān)注
  • 326 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)