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

construindo uma consulta dinâmica no mysql e golang


Para responder à sua pergunta sobre como formatar a string, a resposta simples é usar fmt.Sprintf para estruturar sua string. No entanto veja mais abaixo para uma nota rápida sobre o uso de fmt.Sprintf para consultas de banco de dados:

Exemplo:
query := fmt.Sprintf("SELECT id FROM users WHERE login='%s'", login)
err = db.Query(query)

// Equivalent to:
rows, err := db.Query("SELECT id FROM users WHERE login=?", login)

Usando isso para consultas, você está protegido contra injeções. Dito isto, você pode ficar tentado a modificar isso e usar db.Exec para criações/atualizações/exclusões também. Como regra geral, se você usar db.Exec com fmt.Sprintf e não higienizar suas entradas primeiro, você se abrirá para injeções de sql .

GoPlay com exemplo simples de por que fmt.Sprintf com db.Exec é ruim:
https://play.golang.org/p/-IWyymAg_Q

Você deve usar db.Query ou db.Prepare de forma adequada para evitar esses tipos de vetores de ataque. Você pode ter que modificar o exemplo de código acima para obter um snippet seguro para injeção, mas espero ter dado a você o suficiente para começar.