Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando espaço reservado? na consulta Go mySql para qualquer coisa que não seja int


Você não pode usar marcadores de posição para identificadores (como nomes de tabela e coluna), marcadores de posição são para valores . Você pode pensar em identificadores como sendo semelhantes a nomes de variáveis ​​ou funções em Go, então poder usar espaços reservados para identificadores seria semelhante a ter um eval como em várias linguagens de script.

Isso reduz você a usar fmt.Sprintf e operações de string semelhantes para construir o SQL quando você não conhece os identificadores até o tempo de execução:
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)

mas isso abre você para injeção de SQL e problemas de citação, então você deseja algum tipo de lista de permissões:
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)

Observe que incluí a citação de backtick do MySQL nos valores do mapa. Não há nada na interface padrão para citar/escapar um identificador, então você precisa fazer isso sozinho. Se você já estiver escrevendo o mapa da lista de permissões à mão, também poderá incluir a citação à mão; caso contrário, você poderia escrever sua própria função de citação para identificadores lendo a documentação do MySQL sobre citação e fazendo algumas (espero) operações simples de string.