Nie możesz używać symboli zastępczych dla identyfikatorów (takich jak nazwy tabel i kolumn), symbole zastępcze dotyczą wartości . Możesz myśleć o identyfikatorach jako podobnych do nazw zmiennych lub funkcji w Go, więc możliwość używania symboli zastępczych dla identyfikatorów byłaby podobna do posiadania eval
jak w różnych językach skryptowych.
To ogranicza cię do używania fmt.Sprintf
i podobne operacje na ciągach do budowania SQL, gdy nie znasz identyfikatorów do czasu uruchomienia:
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)
ale to otwiera cię na wstrzykiwanie SQL i problemy z cytowaniem, więc potrzebujesz jakiejś białej listy:
quotedColumns := map[string]string{
"firstName": "`firstName`",
"lastName": "`lastName`",
...
}
quoted, ok := quotedColumns[columnName]
if !ok {
// Do something with the error here and run away...
}
sql := fmt.Sprintf("select %s from persons", quoted)
Zwróć uwagę, że w wartościach mapy umieściłem znak zapytania MySQL. W standardowym interfejsie nie ma nic do cytowania/opisywania identyfikatora, więc musisz to zrobić sam. Jeśli już piszesz ręcznie mapę białej listy, możesz równie dobrze dołączyć cytat ręcznie; w przeciwnym razie możesz napisać własną funkcję cytowania dla identyfikatorów, czytając dokumentację MySQL na temat cytowania i wykonując kilka (miejmy nadzieję) prostych operacji na ciągach znaków.