node.js - para - Actualizando múltiples filas con node-mysql, NodeJS y Q
npm (4)
No creo que pueda (al menos fácil / eficientemente) actualizar varias filas en la forma en que lo está intentando. Básicamente, deberías recorrer tus values
y ejecutar una ACTUALIZACIÓN para cada objeto.
Estoy usando node-mysql, node-js y Q promises.
He actualizado, eliminado e insertado filas con éxito utilizando lo anterior. Además de insertar múltiples filas en una sola declaración en mi escenario de caso de prueba.
Sin embargo, necesito actualizar varias filas con diferentes valores (modo por lotes) en una sola consulta o en un ciclo for.
La información sobre cómo usar declaraciones preparadas en mysql2 (se supone que mejora en node-mysql) es muy escasa y no hay ejemplos, aunque esa debería ser la elección natural, junto con las promesas de compensar la naturaleza asincrónica del nodo-j.
Además, he utilizado con éxito defered.makeNodeResolver () en varios escenarios de prueba.
Estoy tratando de actualizar varias filas en una sola consulta con una cláusula where y condiciones cambiantes.
Está funcionando cuando actualizo una sola fila. Sin embargo, cuando intento actualizar varias filas con una sola consulta, los registros no se actualizan.
Estoy listo para pasar a utilizar un bucle for para realizar múltiples actualizaciones y luego agregar el resultado y enviarlo de regreso del servidor al cliente, lo que habría sido mi segunda opción preferida. Y no veo por qué no debería hacerse de esa manera si no se produce demasiado golpe de rendimiento. Pero no he encontrado ningún ejemplo para hacerlo de esa manera.
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());
El código que se muestra arriba no está actualizando múltiples filas. Me imagino que hay un error en mi sintaxis.
Pero de todos modos, ¿cuál es el mejor enfoque para hacer esto en este escenario particular? ¿Declaraciones preparadas, consultas repetidas en un bucle for o procedimientos almacenados?
este fragmento de código fue tomado de vcl.js para node.js, está escrito en mecanografiado y proporciona una actualización múltiple, eliminación, declaración de inserto en una sola transacción.
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);
})
}
});
}
});
}
Puedes hacerlo de esta manera:
var values = [
{ users: "tom", id: 101 },
{ users: "george", id: 102 }
];
var queries = '''';
values.forEach(function (item) {
queries += mysql.format("UPDATE tabletest SET users = ? WHERE id = ?; ", item);
});
connection.query(queries, defered.makeNodeResolver());
Para utilizar la función de declaraciones múltiples, debe habilitarla para su conexión:
var connection = mysql.createConnection({
...
multipleStatements: true,
});
Probablemente deberías hacer lo siguiente
UPDATE DB.table
SET table.row = newValue WHERE table.someColumn in (''columnVal1'', ''columnVal2'');
ex.
UPDATE DB.Students
SET result = "pass" WHERE rollNo in (21, 34, 50);