2017-10-21 27 views
2

我從來沒有在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?或者有沒有其他方法不能爲查詢輸入每個變量組合?

回答

4

如果你有一個字段名稱和這樣值的地圖:

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