node.js - update - npm mysql




用node-mysql,NodeJS和Q更新多行 (3)

我不認為你可以(至少很容易/有效地)以你嘗試的方式更新多行。 你基本上必須循環你的values並為每個對象執行UPDATE。

我正在使用node-mysql,node-js和Q promise。

我已經成功更新,刪除,並插入單行使用上述。 以及在我的測試用例場景中在單個語句中插入多行。

但是,我需要在單個查詢或for循環中更新具有不同值(批處理模式)的多行。

關於如何在mysql2中使用準備好的語句(假設在node-mysql上有所改進)的信息非常稀少,沒有任何例子,儘管這應該是自然的選擇,同時還要承諾彌補node-js的異步性質。

另外,我在各種測試場景中成功地使用了defered.makeNodeResolver()。

我正在嘗試更新多個行在一個單一的查詢與where子句和改變條件。

當我更新單行時它正在工作。 但是,當我嘗試用單個查詢更新多行時,記錄不會更新。

我準備切換到使用for循環來執行多個更新,然後匯總結果並將其從服務器發送回客戶端,這將是我的第二個首選選擇。 如果沒有太多的表現,我不明白為什麼不這樣做。 但是我還沒有找到這樣做的例子。

var values = [
    { users: "tom", id: 101 },
    { users: "george", id: 102 }
    ];

    // var params = [values.users, values.id ];

    var sql = 'UPDATE tabletest SET users = ? WHERE id = ?;';


    connection.query(sql, [{users: values[0].users}, {id: values[0].id }], defered.makeNodeResolver());

上面顯示的代碼實際上並沒有更新多行。 我想我的語法有一個錯誤。

但無論如何,在這個特定的場景中,最好的方法是什麼? 準備好的語句,for循環中的重複查詢或存儲過程?


這段代碼是從node.js的vcl.js中獲得的,它是用typescript編寫的,並且在單個事務中提供了一個多重更新,刪除,更新記錄。

export class SQLStatment {
    sql: string;
    params: Object
}

var dbError: string;
var execCount: number = 0;
function DBexecuteBatchMYSQLSingle(connection: any, SQLStatmentArray: Array<SQLStatment>, index: number, callback: () => void) {
    execCount++;
    connection.query(SQLStatmentArray[index].sql, SQLStatmentArray[index].params, function (err, rows, fields) {
        if (err) dbError = err;
        if (index + 1 == SQLStatmentArray.length) callback();
        else {
            if (!dbError) {
                DBexecuteBatchMYSQLSingle(connection, SQLStatmentArray, index + 1, function () {
                    if (index == 0) callback();
                });
            }
        }
    });
}

function DBBatchUpdateMYSQL(SQLStatmentArray: Array<SQLStatment>, callback?: (err) => void) {
    var mysql = require('mysql');
    var connection = mysql.createConnection({
        host: "host",user: "user",database: "db",
        port: 1022, password: "pass"});
    dbError = null;
    execCount = 0;
    connection.beginTransaction(function (err) {
        if (err && callback) callback("Database error:" + err);
        else {
            DBexecuteBatchMYSQLSingle(connection, SQLStatmentArray, 0, () => {
                if (dbError) {
                    connection.rollback(function () {
                        if (callback) callback("Database error:" + dbError);
                    });
                } else {
                    connection.commit(function (err) {
                        if (callback) callback(null);
                    })
                }
            });
        }
    });
}

你可能應該採取以下的方式

UPDATE DB.table
SET table.row = newValue WHERE table.someColumn in ('columnVal1', 'columnVal2');

恩。

UPDATE DB.Students
SET result = "pass" WHERE rollNo in (21, 34, 50);




node-mysql