node-sqlite3 es una librería que permite conectarnos a una base de datos SQLite dentro de las características más notable podemos mencionar:
- Asíncrona y sin bloqueos.
- Interfaz sencilla de enlace de parámetros y consultas.
- Soporta datos de tipo Buffer/Blob.
- Métodos que te permiten depurar y saber lo que está sucediendo detrás de la «escena»: modo verbose, evento trace, evento profile.
- Interfaz sencilla de consulta y enlace de parámetros.
- API de serialización de consultas.
- Soporta extensiones, incluyendo json1.
- Ampliamente probada.
- Desarrollada en C++ moderno y probada extensivamente contra consumo excesivo de memoria.
Es recomendable leer:
- Instalando Express – Un Framework Web Para NodeJS
- NVM – Administrador de versiones para NodeJS
- Recarga tus aplicaciones automáticamente con Nodemon
- 3 formas de instalar Node.js
Paso 1: Instalar
Con el siguiente comando instalamos la librería y la agregamos a las dependencias del proyecto.
$ npm i --save sqlite3
Paso 2: Crear el DIR db
$ mkdir db
Paso 3: Crear el fichero connection.js
Crear
$ touch db/connection.js
Agregar
const sqlite3 = require('sqlite3').verbose();
class DB {
static #db;
static open() {
if (this.#db == undefined) {
this.#db = new sqlite3.Database('./sakila.db', sqlite3.OPEN_READWRITE | sqlite3.OPEN_FULLMUTEX, (err) => {
if (err) {
console.error(err.message);
} else {
console.log('Connection is ready!');
}}
);
}
return this.#db;
}
static close() {
if (this.#db != undefined) {
this.#db.close();
this.#db = undefined;
}
}
}
module.exports = DB;
`
La clase DB contiene la variable estática y privada db
y 2 métodos estáticos: open
y close
el método open crea una instancia de la clase Database
y lo asigna a la variable db
, luego se devuelve esta variable, analicemos los parámetros que se le pasan al constructor de la clase Database
, el primer parámetro es el camino donde se encuentra la base de datos sqlite
o también puede ser :memory:
para crear una base de datos en memoria, el segundo parámetro (opcional) son las opciones: sqlite3.OPEN_READWRITE = modo lectura/escritura, sqlite3.OPEN_FULLMUTEX = varios hilos pueden usar la misma base de datos de forma segura, puede ver todas las opciones en la API, el tercer parámetro (opcional) es un callback que recibe un parámetro: error en caso de que falle la conexión, null si la conexión fue exitosa.
El método close cierra la conexión y libera recursos, y por último se exporta la clase para que sea accesible desde otros lugares de la aplicación.
Paso 3 – Usar y crear la conexión.
Usaremos el port de sakila a sqlite para nuestro ejemplo, luego de crear el esquema e importar los datos, creamos el fichero films.js
dentro de route y agregamos:
var express = require('express');
var router = express.Router();
const db = require('../db/connection')
/* GET users listing. */
router.get('/', function(req, res, next) {
const conn = db.open();
//res.send('respond with a resource');
conn.all('SELECT title, description FROM film LIMIT 10', function(err, rows) {
if (err) {
console.error(err.message);
res.send(err.message)
} else {
res.render('films', { title: 'Films', rows: rows });
}
})
db.close();
});
module.exports = router;
Consulte el método all para más información.
Luego creamos la plantilla films.pug
dentro del DIR views
y agregamos:
extends layout
block content
h1= title
p Welcome to #{title}
table
each row in rows
tr
td #{row.title}
td #{row.description}
Creamos la ruta correpondiente agregando las siguientes líneas al fichero app.js
var filmsRouter = require('./routes/films');
app.use('/films', filmsRouter);
Luego abre la siguiente URL http://localhost:10000/films
y debe ver la siguiente información
Films
Welcome to Films
ACADEMY DINOSAUR A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies
ACE GOLDFINGER A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China
ADAPTATION HOLES A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory
AFFAIR PREJUDICE A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank
AFRICAN EGG A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico
AGENT TRUMAN A Intrepid Panorama of a Robot And a Boy who must Escape a Sumo Wrestler in Ancient China
AIRPLANE SIERRA A Touching Saga of a Hunter And a Butler who must Discover a Butler in A Jet Boat
AIRPORT POLLOCK A Epic Tale of a Moose And a Girl who must Confront a Monkey in Ancient India
ALABAMA DEVIL A Thoughtful Panorama of a Database Administrator And a Mad Scientist who must Outgun a Mad Scientist in A Jet Boat
ALADDIN CALENDAR A Action-Packed Tale of a Man And a Lumberjack who must Reach a Feminist in Ancient China