sql >> Base de Datos >  >> RDS >> Mysql

¿Usando marcador de posición? en la consulta Go mySql para cualquier otra cosa que no sea int

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.