Usando pg-native con Node.js

Cuando usamos Node.js muchas veces necesitamos acceder a base de datos relacionales, por ello hoy veremos un módulo para acceder de manera nativa a PostgreSQL.

Este es pg-native, que nos permite acceder de manera nativa a PostgreSQL a través de la librería libpq disponible en nuestro sistema operativo. Ganando de esta manera un 30% de performance (algo nada despreciable en sistemas con alta concurrencia).

Es importante destacar que para que pg-native funcione debemos contar con las dependencias libpq-dev instaladas en nuestro sistema operativo.

Dejamos algunos ejemplos:

$ sudo apt-get install libpq-dev # Ubuntu
$ yum install postgresql-devel # RHEL/CentOS
$ brew install postgres # OS X

Para otros sistemas operativos, podemos buscar un poco en google ;).

Creamos un proyecto

Desde linea de comandos creamos una carpeta en nuestro home, o donde mas nos guste. Seguimos los siguientes pasos:

$ cd $HOME
$ mkdir pg-project
$ cd pg-project
$ npm init -y

De esta manera tendremos un proyecto creado con un archivo package.json.

Archivo ./package.json

{
“name”: “pg-project”,
“version”: “1.0.0”,
“description”: “Es una prueba de pg-native”,
“main”: “main.js”,
“scripts”: {
“start”: “node main.js”
},
“keywords”: [
“pg”,
“pg-native”,
“postgresql”,
“postgres”
],
“author”: “Carlos Vallejos <carlos@vamyal.com>”,
“license”: “ISC”,
“dependencies”: {
“pg-native”: “^1.10.0”
}
}

Instalando pg-native de forma local en nuestro proyecto

Desde la linea de comandos a través de npm instalamos pg-native.

$ npm i pg-native -S

Dependiendo de como hayamos instalado Node.js podría ser necesario ejecutar el comando anterior como usuario administrador (sudo).

$ sudo npm i pg-native -S

Con esto logramos que se instalen los módulos en la carpeta node_modules -si no existe, se crea automáticamente- situada en la carpeta raíz de nuestro proyecto y además se agrega dicha dependencia en nuestro archivo package.json bajo el atributo dependencies.

Desarrollando un ejemplo

En la carpeta raíz de nuestro proyecto creamos una carpeta llamada db, y dentro de ella un archivo index.js con el siguiente contenido:

$ mkdir db
$ touch index.js

Archivo ./db/index.js

'use strict'
let pg = require(‘pg-native’)
let configPG = 'postgresql://postgres:postgres@localhost:5432/postgres'
module.exports = {
// Creamos la funcion para enviar comandos sql a la bd,
// una vez conectados y retornando como Promise.
query : ( sqlCommand ) => {
return new Promise( (resolve, reject) => {
let pgCliente = new pg()
pgCliente.connect(configPG, (err)=>{
if (err) return reject(err)
pgCliente.query(sqlCommand, (err, result) => {
if (err) return reject(err)
resolve(result)
pgCliente.end()
})
})
})
}
}

En el archivo index.js de la carpeta db creamos una variable de conexión configPG que apunta a localhost, base de datos: postgres , usuario: postgres, password: postgres y puerto: 5432. Estos parámetros deberán ser modificados según corresponda.

Luego exportamos el archivo como un módulo javascript, con una función como atributo denominada ‘query’ a la cual vamos a pasar el string SQL que queramos ejecutar en la base de datos, si la conexión resultase exitosa. Además esta función retorna una Promise de manera a poder tratarla de manera sincrónica.

Una vez terminada la ejecución query nativa, procedemos a terminar la conexión a la base de datos con la función end().

Finalmente en la carpeta raíz del proyecto creamos un archivo javascript llamado main.js.

$ touch main.js

Archivo ./main.js

'use strict'
let db = require(‘./db’)
let sqlCommand = `SELECT current_date as hoy, current_time as hora`
db
.query( sqlCommand )
.then( result => console.log(‘Hoy:’, result[0].hoy, ‘Hora: ‘, result[0].hora) )
.catch( err => console.log(err) )

Lo primero que hacemos es importar el modulo db con require, y lo guardamos en la variable con el mismo nombre. Luego creamos una variable sqlCommand con el comando SQL que queremos ejecutar en la base de datos, lo que hacemos es con un SELECT pedir la fecha actual y la hora actual con las funciones current_date y current_time respectivamente de PostgreSQL.

Para probar podemos ejecutar desde linea de comandos lo siguiente:

$ node main
Hoy: Tue Apr 19 2016 00:00:00 GMT-0400 (PYT) Hora: 14:26:02.356803-04

Y el resultado sería como se muestra arriba ^.

También, si tenemos configurada la sección scripts de nuestro package.json (ver mas arriba), podemos ejecutar de la siguiente manera:

$ npm start

Espero que les sea de utilidad y a partir de éste mini proyecto puedan desarrollar sistemas en Node.js con bases de datos PostgreSQL.

Les dejo además el link con el proyecto completo en github.com

Cabu Vallejos

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.