No puede usar marcadores de posición para identificadores (como nombres de tablas y columnas), los marcadores de posición son para valores . Puede pensar en los identificadores como similares a los nombres de variables o funciones en Go, por lo que poder usar marcadores de posición para los identificadores sería similar a tener un eval
como en varios lenguajes de secuencias de comandos.
Esto lo reduce a usar fmt.Sprintf
y operaciones de cadena similares para construir el SQL cuando no conoce los identificadores hasta el tiempo de ejecución:
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)
pero esto lo abre a la inyección de SQL y problemas de cotización, por lo que querrá algún tipo de lista blanca:
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)
Tenga en cuenta que he incluido las comillas invertidas de MySQL en los valores del mapa. No hay nada en la interfaz estándar para citar/escapar un identificador, por lo que debe hacerlo usted mismo. Si ya está escribiendo el mapa de la lista blanca a mano, también puede incluir la cita a mano; de lo contrario, podría escribir su propia función de cotización para identificadores leyendo la documentación de MySQL sobre cotización y haciendo un par (con suerte) de operaciones de cadena simples.