Не можете да използвате заместители за идентификатори (като имена на таблици и колони), заместителите са за стойности . Можете да мислите за идентификаторите като подобни на имената на променливи или функции в Go, така че възможността да използвате заместители за идентификатори би било подобно на това да имате eval
както в различни скриптови езици.
Това ви свежда до използването на fmt.Sprintf
и подобни низови операции за изграждане на SQL, когато не знаете идентификаторите до времето на изпълнение:
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)
но това ви отваря за SQL инжекция и проблеми с цитирането, така че бихте искали някакъв бял списък:
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)
Обърнете внимание, че включих цитирането на MySQL backtick в стойностите на картата. В стандартния интерфейс няма нищо за цитиране/изключване на идентификатор, така че трябва да го направите сами. Ако вече пишете картата на белия списък на ръка, тогава можете също да включите цитирането на ръка; в противен случай бихте могли да напишете своя собствена функция за цитиране за идентификатори, като прочетете документацията на MySQL за цитирането и извършите няколко (надявам се) прости операции с низове.