2016-03-03 24 views
1

我試圖讓使用javascript在PostgreSQL的一些更新請求,但我有一些麻煩的更新方法:只有當傳遞的值不是未定義時,如何更新表? [PostgreSQL的]

我用什麼有是這樣的:

var query = client.query("UPDATE COMPANY SET company_name=$1, phone=$2 WHERE company_id = $3", [data.company_name, data.phone, company_id_requested]); 

無論data.company_namedata.phone的值如何,都會更新表格公司。問題是這些值可能是未定義的,但如果這些值未定義,我不想將表值更新爲NULL。

我已經嘗試了新的代碼來解決這個問題,但我真的不覺得它的清潔,尤其是因爲我必須這樣做,每次更新方法...

var queryText = "UPDATE COMPANY SET "; 
    var params = []; 
    if (data.company_name !== undefined) { 
     if (params.length != 0) 
      queryText += ", "; 
     params.push(data.company_name); 
     queryText += "company_name=$" + params.length; 
    } 
    if (data.phone !== undefined) { 
     if (params.length != 0) 
      queryText += ", "; 
     params.push(data.phone); 
     queryText += "phone=$" + params.length; 
    } 
    params.push(company_id_requested); 
    queryText += " WHERE company_id = $" + params.length; 
    console.log(queryText); 
    var query = client.query(queryText, params); 

在這裏,我很很多構造查詢。沒有其他辦法可以做到嗎?

+0

你不能用'節點postgres'做到這一點,因爲它不允許在查詢動態使用列名,更少的自定義類型。但是,如果你使用[pg-promise](https://github.com/vitaly-t/pg-promise),那將很容易完成。 –

+0

再次想到,我已經爲您發佈了一個可能的解決方案;) –

回答

1

下列功能就會爲您生成這樣的更新,從表名稱和屬性的對象來進行設置:

function createUpdate(table, data) { 
    if (!table || typeof table !== 'string') { 
     throw new TypeError("Parameter 'table' must be a non-empty string."); 
    } 
    if (!data || typeof data !== 'object') { 
     throw new TypeError("Parameter 'data' must be an object."); 
    } 
    var keys = Object.keys(data) 
     .filter(function (k) { 
      return data[k] !== undefined; 
     }); 
    var names = keys.map(function (k, index) { 
     return k + ' = $' + (index + 1); 
    }).join(', '); 
    var values = keys.map(function (k) { 
     return data[k]; 
    }); 
    return { 
     query: 'UPDATE ' + table + ' SET ' + names, 
     values: values 
    }; 
} 

測試:

var obj = { 
    one: 1, 
    two: 'two', 
    last: undefined 
}; 

var update = createUpdate("Company", obj); 

這將創建對象:

{ query: 'UPDATE Company SET one = $1, two = $2', values: [ 1, 'two' ] } 

所以你可以撥打:

client.query(update.query, update.values); 
-1

嘗試添加條件到WHERE子句:

var query = client.query("UPDATE COMPANY SET company_name=$1, phone=$2 WHERE company_id = $3 AND $1 IS NOT NULL AND $2 IS NOT NULL", [data.company_name, data.phone, company_id_requested]); 
+0

這產生了一個完全不同於所詢問的更新邏輯。 –

相關問題