nodo-postgres creare database
Sto usando nodo-postgres, e all’inizio della mia applicazione ho voglia di verificare se il database esiste o non esiste. Quindi il mio flusso di lavoro idea è la seguente:
- Verificare se
myDb
è esistente - Se c’è, creare le tabelle
- Se non, quindi creare il primo database, tabelle
Come potete vedere, è davvero un processo facile, tuttavia, l’implementazione di driver richiede di avere un nome di database postgres://username:[email protected]/database
essere collegati, il che significa che è necessario per connettersi a un database.
Così quello che sto facendo adesso è per la connessione a postgres
database all’inizio, facendo una query per creare database, cathing eccezione se è già presente, quindi chiudere la mia connessione e il collegamento al database appena creato, quindi la creazione di tabelle. Ecco il codice:
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...)';
});
});
});
Come vedi io sto aprendo e chiudendo la connessione due volte, e in questo modo sembra sbagliato per me. Sarò felice se si proporre un modo migliore, o forse spiegare come hai fatto a realizzare questo.
- Per quanto ne so non c’è nessun comando per impostare il database di cui si è collegati (in psql c’è
\c nameOfOtherDb
ma che è un comando psql che creare una nuova connessione e si chiude il vecchio). - Un’altra tecnica: si potrebbe utilizzare una query per vedere se esiste una connessione (da “amministrativo” connessione):
select count(*) from pg_catalog.pg_database where datname = 'the_db_name_here';
, quindi creare/aprire la seconda connessione. Se si esegue la connessione a 2 database, questo non sembra un problema. - il recupero disponibili dbs e verificare se la mia è che ci permetteranno di creare un if/else e questo si romperà il mio sincrono richiamate. ecco perché ho finito di creare il db e catturare l’eccezione
- Nella riga che dice
// ignore if the db is there
, si sta ignorando tutti gli errori. Ignorare il duplicato db di errore, è possibile fare qualcosa di simileif (err && err.code === '42P04') { console.log('ignoring the error'); } else if (err) { throw err; }
Non è a causa dell’implementazione del driver, è PostgreSQL stesso. È lo stesso con qualsiasi altra lingua o driver.
Un cliente ha bisogno di essere collegato a un database in modo da poter fare qualsiasi cosa, anche un
CREATE DATABASE
. Oltre allapostgres
database,template1
è spesso utilizzato per questo scopo.Quindi, dal momento che è necessario connettersi al database appena creato per creare oggetti al suo interno, non c’è modo di evitare di aprire un’altra connessione.
In breve, ciò che si sta facendo non può essere semplificato, è già ottimale.
Ho appena scritto un modulo di: https://github.com/olalonde/pgtools
Speranza di rendere il codice un po ‘ più pulito.
Questo è un po ‘ vecchio, ma voglio solo condividere come ho gestito questo tipo di installazione.
È necessario chiamare il terzo param dalla funzione di callback che è il
done
dapg.connect(conn, (err, client, done) => {})
. Questo rilascerà la connessione e riportare alla piscina.Installare
CLI Esempio