Saltar al contenido principal

Consulta y Ejecución - Comandos directos en Base de Datos

Antes de empezar​

Para poder comprender este tutorial con la mayor eficacia posible, le aconsejamos que se asegure de que tiene nociones básicas de JavaScript, SQL y que sabe crear servicios en Netuno.

Si no sabe crear servicios, diríjase a Servicios Web REST.

Creación de consultas​

Netuno incluye funciones orientadas a la creación de consultas a la base de datos, y en este tutorial iremos presentando y describiendo brevemente el efecto de cada una, así como las buenas prácticas para obtener el mejor resultado.

_db.query('SELECT * FROM ...')​

Esta función permite devolver datos de una consulta.

_out.json(
_db.query('SELECT * FROM tabla_nombre')
)

Tenga en cuenta que la función _out.json() permite visualizar en pantalla los datos del servicio al llamarlo en el navegador

Esta función también permite aceptar argumentos, que se pasan directamente mediante la llamada al servicio; por ejemplo, imaginemos que tenemos el servicio seleccionar-todos.js, la llamada al mismo se realizará mediante http://localhost:9000/services/seleccionar-todos.netuno, donde los argumentos que se van a pasar se colocan a continuación de la llamada, después de un signo de interrogación:

http://localhost:9000/services/seleccionar-todos.netuno?argumento1=1&argumento2=nombre

Tenga en cuenta que para enviar múltiples argumentos basta con separarlos con un ampersand (&)

Consulta con parámetros​

Y por último, basta declarar esta variable en la consulta de la siguiente forma:

_out.json(
_db.query(
'SELECT * FROM tabla_nombre WHERE id = ? AND nombre = ?',
_req.getInt("argumento1"), _req.getString("argumento2")
)
)

En lugar de los '?' (interrogaciones) se inyectará el parámetro correspondiente según su orden.

Consulta con parámetros y tipos de PostgreSQL y H2DataBase​

No obstante, H2Database y PostgreSQL admiten una sintaxis de conversión simple, y así podemos asignar tipos a los parámetros de la siguiente forma:

_out.json(
_db.query(
'SELECT * FROM tabla_nombre WHERE id = ?::int AND nombre = ?::varchar',
_req.getInt("id"), _req.getString("nombre")
)
)

Tipos de parámetros de H2Database y PostgreSQL​

Como habrá podido observar anteriormente, cuando se pretende ejecutar una consulta con argumentos hay que definir el tipo de los mismos. A continuación se muestra una lista con todos los tipos de variables y cuál es el tipo más adecuado para cada uno:

  • Adecuado para parámetros de números enteros:
    • ?::int
  • Adecuado para parámetros de números decimales:
    • ?::float
  • Adecuado para parámetros de identificador único global/universal, más conocidos como guid o uuid:
    • ?::uuid
  • Adecuado para parámetros de texto genérico, cadenas:
    • ?::varchar
    • ?::text
  • Adecuado para parámetros de tipo fecha:
    • ?::date
  • Adecuado para parámetros de tipo hora:
    • ?::time
  • Adecuado para parámetros con fecha y hora:
    • ?::datetime (H2Database)
    • ?::timestamp (PostgreSQL)

_db.execute('INSERT INTO | UPDATE | DELETE ...')​

Esta función permite ejecutar un comando de base de datos, como updates, inserts y deletes.

Devuelve el número de registros afectados por el comando ejecutado.

// Ejemplo de inserción:
const nRegistrosInsertados = _db.execute(
"INSERT INTO tabla_nombre(id, activo, nombre) " +
"VALUES(nextval('tabla_nombre_id'), ?::int, ?::varchar)",
1, nombre
)

//Ejemplo de actualización:
const nRegistrosActualizados = _db.execute(
"UPDATE tabla_nombre SET nombre = ?::varchar WHERE id = ?::int",
_req.getString("nombre"), _req.getInt("id")
)

// Ejemplo de eliminación:
const nRegistrosEliminados = _db.execute(
"DELETE FROM tabla_nombre WHERE id = ?::int",
_req.getInt("id")
)

Nota: Al hacer un insert, compruebe que el campo activo es igual a 1; de lo contrario, no aparecerá en el resultado.

Ejemplo de interacción con los datos​

A continuación presentamos normas recomendadas para obtener los mejores resultados posibles.

Primera consulta​

Vea a continuación cómo obtener la primera fila de la consulta, o será nulo si no se obtiene ninguna fila.

// Seleccionar los datos:
const resultadoDb = _db.queryFirst(
'SELECT nombre FROM tabla_nombre WHERE uid = ?::uuid',
_req.getString("uid")
)
if (!resultadoDb) {
// Código de estado HTTP:
_header.status(404)
// Indicación del error:
_out.json(
_val.map()
.set('error', 'id-no-encontrado')
)
// Finaliza la ejecución del servicio:
_exec.stop()
}

Validar la cantidad de registros​

Cuando realiza una selección en la base de datos cuyo resultado sea único, para acceder a los datos conviene proceder de la siguiente forma:

Tenga en cuenta que este es solo un ejemplo sencillo que garantiza que se devuelva al menos 1 resultado y evita el error en caso de que no haya resultado.

// Selección de los datos:
var resultadosDb = _db.query(
'SELECT nombre FROM tabla_nombre WHERE id = ?::int',
_val.init()
.add(_req.getInt("id"))
)
let nombre = null;
// Garantiza que existen datos, y se puede utilizar el
// símbolo mayor (resultado.length > 1) en caso
// de que haya más de un registro:
if (resultadosDb.size() >= 1) {
// Para acceder al valor del nombre directamente basta con:
nombre = resultadosDb.get(0).getString('nombre');
}

Iteración en bucle de los registros​

Si el resultado de la selección son múltiples resultados, puede interactuar con el bucle 'for' para obtener los datos de la siguiente forma:

// Ejecutar la consulta
const resultadosDb = _db.query('SELECT id, nombre FROM tabla_nombre');

// Inicializar la variable para que esta pueda recibir valores
const elementos = _val.init();

// Iteración por todos los resultados para recibir cada valor por separado
for (const registroDb of resultadosDb) {
elementos.push(
_val.map()
.set("uid", registroDb.getString("uid"))
.set("nombre", registroDb.getString("nombre"))
);
}

// Envía en la salida de datos la nueva lista de datos:
_out.json(elementos);

Si tiene alguna pregunta, no dude en contactar; consulte las indicaciones en el pie de página de este sitio web.

¡Buen desarrollo!