Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Platzhalter verwenden? in Go mySql-Abfrage für etwas anderes als int

Sie können keine Platzhalter für Bezeichner (wie Tabellen- und Spaltennamen) verwenden, Platzhalter sind für Werte . Sie können sich Bezeichner ähnlich wie Variablen- oder Funktionsnamen in Go vorstellen, sodass die Verwendung von Platzhaltern für Bezeichner einem eval gleicht wie in verschiedenen Skriptsprachen.

Dies reduziert Sie auf die Verwendung von fmt.Sprintf und ähnliche Zeichenfolgenoperationen zum Erstellen der SQL, wenn Sie die Bezeichner bis zur Laufzeit nicht kennen:

col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)

aber dies eröffnet Ihnen Probleme mit der SQL-Einschleusung und Zitaten, sodass Sie eine Art Whitelist benötigen:

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)

Beachten Sie, dass ich das MySQL-Backtick-Zitat in die Werte der Karte eingefügt habe. In der Standardschnittstelle gibt es nichts zum Zitieren/Escapen eines Bezeichners, also müssen Sie es selbst tun. Wenn Sie die Whitelist-Karte bereits von Hand schreiben, können Sie auch das Zitat von Hand hinzufügen. andernfalls könnten Sie Ihre eigene Quoting-Funktion für Bezeichner schreiben, indem Sie die MySQL-Dokumentation zum Quoting lesen und ein paar (hoffentlich) einfache String-Operationen durchführen.