Node + Mysql + Autoincrement
Publicado por Javier (1 intervención) el 13/01/2019 18:52:06
Buenos días!
Soy muy nuevo en el mundo de javascript y me senté a leer un poquito de node y mysql 8 (trabajando como document store) para crear un mini bot para un servidor de Discord (utilizando Discordjs).
Soy consciente de las ventajas y desventajas de realizar campos auto-incrementales en bases de datos NOSQL y también tengo en cuenta que la base de datos genera automáticamente un valor en el campo ._id que puede utilizarse para realizar búsquedas y orden de inserción y un largo etc.
De cualquier manera estoy dispuesto a realizar una colección que tenga documentos con un campo auto-incremental. El problema es que no puedo lograrlo (xD!)
Hay muchos tutoriales y foros donde utilizan una función donde almacenan el número con la secuencia actual de los registros, algo como:
Pero no he podido adaptar ese código a Mysql (la función de arriba funciona en MongoDB).
El operador $inc no funciona de la misma manera en mysql o al menos no encontré ningún lugar donde poder leer al respecto.
Traté de realizar dos funciones, una que busque el valor actual en la colección de secuencias y otra función que modifique ese valor (agregandole + 1), que sería básicamente lo que hace el operador $inc, pero la asincronía me está jugando una mala pasada.
Explico un poco, por que sé que voy a tener más de un error en algún lado y posiblemente toda mi lógica esté funcionando mal.. pero aquí va lo que hice:
- Tengo una colección llamada "Secuencias" donde guardo la secuencia actual y una colección llamada "Collection" que quiero que tenga el id auto incremental.
- "Session" es una constante que contiene la conexión a mysql activa.
- Dentro de una función async, a la hora de guardar los datos ejecuto algo como:
El problema es que al ejecutar el codigo, "actual" es undefined.. por lo que no puedo leer su campo secuencia.
Supongo que esto se da por la asincronía y no logro encontrar como solucionarlo
Como dije antes, acabo de sentarme a leer sobre TODAS las tecnologías que estoy utilizando (incluyendo Discordjs).. así que tengo muy claro que errores debo tener.
Todas las críticas y posibles soluciones son más que bienvenidas.
Muchas gracias.
Soy muy nuevo en el mundo de javascript y me senté a leer un poquito de node y mysql 8 (trabajando como document store) para crear un mini bot para un servidor de Discord (utilizando Discordjs).
Soy consciente de las ventajas y desventajas de realizar campos auto-incrementales en bases de datos NOSQL y también tengo en cuenta que la base de datos genera automáticamente un valor en el campo ._id que puede utilizarse para realizar búsquedas y orden de inserción y un largo etc.
De cualquier manera estoy dispuesto a realizar una colección que tenga documentos con un campo auto-incremental. El problema es que no puedo lograrlo (xD!)
Hay muchos tutoriales y foros donde utilizan una función donde almacenan el número con la secuencia actual de los registros, algo como:
1
2
3
4
5
6
7
8
9
10
function getNextSequenceValue(sequenceName){
var sequenceDocument = db.counters.findAndModify({
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
new:true
});
return sequenceDocument.sequence_value;
}
Pero no he podido adaptar ese código a Mysql (la función de arriba funciona en MongoDB).
El operador $inc no funciona de la misma manera en mysql o al menos no encontré ningún lugar donde poder leer al respecto.
Traté de realizar dos funciones, una que busque el valor actual en la colección de secuencias y otra función que modifique ese valor (agregandole + 1), que sería básicamente lo que hace el operador $inc, pero la asincronía me está jugando una mala pasada.
Explico un poco, por que sé que voy a tener más de un error en algún lado y posiblemente toda mi lógica esté funcionando mal.. pero aquí va lo que hice:
- Tengo una colección llamada "Secuencias" donde guardo la secuencia actual y una colección llamada "Collection" que quiero que tenga el id auto incremental.
- "Session" es una constante que contiene la conexión a mysql activa.
- Dentro de una función async, a la hora de guardar los datos ejecuto algo como:
1
2
3
4
5
6
obtenerActual(Session, (actual) =>{
modificarActual(actual.secuencia + 1, Session, (result) =>{
Session.getSchema('Schema').getCollection('Collection').add({id: result.secuencia, dato: loquesea}).execute()
console.log(actual, result);
})
})
El problema es que al ejecutar el codigo, "actual" es undefined.. por lo que no puedo leer su campo secuencia.
Supongo que esto se da por la asincronía y no logro encontrar como solucionarlo
1
2
3
4
5
6
7
8
9
10
11
12
obtenerActual(Session, callback) {
callback(
session.getSchema('Schema').getCollection('Secuencias').find("id = 'Sid'").sort(["secuencia
desc"]).limit(1).execute()
)
}
modificarActual(actual, Session, callback) {
callback(
session.getSchema('Schema').getCollection('Secuencias').modify("id = 'Sid'", actual).execute()
)
}
Como dije antes, acabo de sentarme a leer sobre TODAS las tecnologías que estoy utilizando (incluyendo Discordjs).. así que tengo muy claro que errores debo tener.
Todas las críticas y posibles soluciones son más que bienvenidas.
Muchas gracias.
Valora esta pregunta


0