sequelize postgres postgre node example node.js postgresql

node.js - postgres - pg node postgre



nodo-postgres crear base de datos (4)

Estoy usando node-postgres , y al principio de mi aplicación quiero verificar si la base de datos existe o no. Así que mi idea de flujo de trabajo es la siguiente:

  1. Compruebe si myDb existe
  2. Si está ahí, crea las tablas.
  3. Si no, cree primero la base de datos, luego las tablas

Como ve que es un proceso realmente fácil, sin embargo, la implementación del controlador requiere tener un nombre de postgres://username:password@host/database datos postgres://username:password@host/database de postgres://username:password@host/database para conectarse, lo que significa que primero debe conectarse a una base de datos.

Entonces, lo que estoy haciendo ahora es conectarme a la postgres datos de postgres al principio, hacer una consulta para crear la base de datos, descartar la excepción si ya está allí, cerrar mi conexión y conectarme a la base de datos recién creada, luego crear las tablas. Aquí está el código:

var conStringPri = ''postgres://'' + username + '':'' + password + ''@'' + host + ''/postgres''; var conStringPost = ''postgres://'' + username + '':'' + password + ''@'' + host + ''/'' + dbName; pg.connect(conStringPri, function(err, client, done) { // connect to postgres db if (err) console.log(''Error while connecting: '' + err); client.query(''CREATE DATABASE '' + dbName, function(err) { // create user''s db if (err) console.log(''ignoring the error''); // ignore if the db is there client.end(); // close the connection // create a new connection to the new db pg.connect(conStringPost, function(err, clientOrg, done) { // create the table clientOrg.query(''CREATE TABLE IF NOT EXISTS '' + tableName + '' '' + ''(...some sql...)''; }); }); });

Como ves, estoy abriendo y cerrando la conexión dos veces, y de esta manera me parece mal. Me alegraré si propones una mejor manera, o tal vez expliques cómo lograste esto.


Como ve que es un proceso realmente fácil, sin embargo, la implementación del controlador requiere tener un nombre de base de datos postgres: // nombre de usuario: contraseña @ host / base de datos para conectarse, lo que significa que primero debe conectarse a una base de datos.

No es debido a la implementación del controlador, es PostgreSQL en sí. Es lo mismo con cualquier otro idioma o controlador.

Un cliente necesita estar conectado a una base de datos para hacer cualquier cosa, incluyendo CREATE DATABASE . Además de la postgres datos de postgres , la template1 se usa para este propósito.

Entonces, ya que debe conectarse a la base de datos recién creada para crear objetos dentro de ella, no hay forma de evitar abrir otra conexión.

En resumen, lo que estás haciendo no se puede simplificar, ya es óptimo.


Acabo de escribir un módulo para eso: https://github.com/olalonde/pgtools

var pgtools = require(''pgtools''); pgtools.createdb({ user: ''postgres'', password: ''some pass'', port: 5432, host: ''localhost'' }, ''test-db'', function (err, res) { if (err) { console.error(err); process.exit(-1); } console.log(res); });

Esperemos que pueda hacer su código un poco más limpio.


Esto es un poco viejo, pero solo quiero compartir cómo manejé este tipo de configuración.

pg.connect(conn, (err, client, done) => {}) llamar al tercer parámetro desde la devolución de llamada que se done desde pg.connect(conn, (err, client, done) => {}) . Esto liberará la conexión y traerá de vuelta a la piscina.

async.series([ done => { pg.connect(connPrimary, (err, client, releaseConn) => { if (err) return done(err) client.query(`CREATE DATABASE ${conf.database}`, (err) => { if (err && !~err.message.indexOf(''already exists'')) { return done(err) } client.end() releaseConn() done() }) }) }, done => { let connSecondary = `postgres://${conf.user}:${conf.password}@${conf.host}:${conf.port}/${conf.database}` pg.connect(connSecondary, (err, client, releaseConn) => { if (err) return done(err) let createTableQuery = `CREATE TABLE IF NOT EXISTS test_table(_id bigint primary key, co2_field varchar(40) NOT NULL, temp_field int NOT NULL, quality_field decimal NOT NULL, reading_time_field timestamp NULL)` client.query(createTableQuery, err => { if (err) return done(err) releaseConn() done() }) }) } ], err => { should.ifError(err) doneInit() })


Instalar

npm install --save -g pgtools

Ejemplo de CLI

createdbjs my_awesome_db --user=admin --password=admin