在golang和mysql中进行动态查询

问题描述:

我从来没有在mysql中使用golang,所以我第一次阅读这些内容。我想要做这样的事情:在golang和mysql中进行动态查询

if userId && gender && age 
db.QueryRow("SELECT name FROM users WHERE userId=? AND gender=? AND age=?", userId,gender,age) 
else if gender && age 
db.QueryRow("SELECT name FROM users WHERE gender=? AND age=?", gender, age) 
else if userId && gender 
db.QueryRow("SELECT name FROM users WHERE userId=? AND gender=?", userId,gender) 
else if userId && age 
db.QueryRow("SELECT name FROM users WHERE userId=? AND age=?", userId, age) 
else if gender 
db.QueryRow("SELECT name FROM users WHERE gender=?", gender) 
else if userId 
db.QueryRow("SELECT name FROM users WHERE userId=?", userId) 
else if age 
db.QueryRow("SELECT name FROM users WHERE age=?", age) 

这是太多打字,尤其是如果我有十几个变量,我想添加到WHERE条件。

如果这是PHP,我会做这样的事情:

$sql = "SELECT name FROM users "; 
$where = array(); 
foreach(explode(",","userId,gender,age,name,height,weight,ethnicity" as $field) 
{ 
    if(isset($arrayOfValues[$field])) 
    { 
     $where[count($where)] = $field." = ?".$field 
     $db->bind("?".$field,$arrayOfValues[$field]); 
    } 
} 

if(count($where)>0) 
$sql = $sql . " WHERE ".implode(" AND ",$where); 
$db->query($sql); 

通过使用foreach循环,我可以动态生成查询并根据需要动态地绑定尽可能多的变量。

是这样的一个选项与golang和mysql?或者有没有其他方法不能为查询输入每个变量组合?

如果你有一个字段名称和这样值的地图:

m := map[string]interface{}{"UserID": 1234, "Age": 18} 

,那么你可以建立这样的查询:

var values []interface{} 
var where []string 
for _, k := range []string{"userId","gender","age","name","height","weight","ethnicity"} 
if v, ok := m[k]; ok { 
    values = append(values, v) 
    where = append(where, fmt.Sprintf("%s = ?", k)) 
} 
r, err := db.QueryRow("SELECT name FROM users WHERE " + strings.Join(where, " AND "), values...) 

这是不容易受到SQL注入,因为占位符用于应用程序直接控制之外的部分查询。

如果映射键被称为是允许的字段名,然后使用此:

var values []interface{} 
var where []string 
for k, v := range m { 
    values = append(values, v) 
    where = append(where, fmt.Sprintf("%s = ?", k)) 
} 
r, err := db.QueryRow("SELECT name FROM users WHERE " + strings.Join(where, " AND "), values...) 
+0

正要批评有关SQL注入,但这种方法并不实际限制字符串操作确实由什么是在什么代码......据我所知。 – RayfenWindspear

+0

我也用这种方式! – Vutuz