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:
- Compruebe si
myDb
existe - Si está ahí, crea las tablas.
- 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