2012-02-09 14 views
90

Mi trovo a cercare di creare un database postgres, quindi ho installato Postgres e avviato un server con initdb /usr/local/pgsql/data, quindi ho avviato quell'istanza con postgres -D /usr/local/pgsql/data ora come posso interagire con questo tramite il nodo ? Ad esempio, quale sarebbe il connectionstring o come sono in grado di scoprire di cosa si tratta.Come effettuare la connessione a Postgres via Node.js

risposta

262

Ecco un esempio che ho usato per connettere node.js al mio database Postgres.

L'interfaccia in node.js che ho usato può essere trovato qui https://github.com/brianc/node-postgres

var pg = require('pg'); 
var conString = "postgres://YourUserName:[email protected]:5432/YourDatabase"; 

var client = new pg.Client(conString); 
client.connect(); 

//queries are queued and executed one after another once the connection becomes available 
var x = 1000; 

while (x > 0) { 
    client.query("INSERT INTO junk(name, a_number) values('Ted',12)"); 
    client.query("INSERT INTO junk(name, a_number) values($1, $2)", ['John', x]); 
    x = x - 1; 
} 

var query = client.query("SELECT * FROM junk"); 
//fired after last row is emitted 

query.on('row', function(row) { 
    console.log(row); 
}); 

query.on('end', function() { 
    client.end(); 
}); 



//queries can be executed either via text/parameter values passed as individual arguments 
//or by passing an options object containing text, (optional) parameter values, and (optional) query name 
client.query({ 
    name: 'insert beatle', 
    text: "INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", 
    values: ['George', 70, new Date(1946, 02, 14)] 
}); 

//subsequent queries with the same name will be executed without re-parsing the query plan by postgres 
client.query({ 
    name: 'insert beatle', 
    values: ['Paul', 63, new Date(1945, 04, 03)] 
}); 
var query = client.query("SELECT * FROM beatles WHERE name = $1", ['john']); 

//can stream row results back 1 at a time 
query.on('row', function(row) { 
    console.log(row); 
    console.log("Beatle name: %s", row.name); //Beatle name: John 
    console.log("Beatle birth year: %d", row.birthday.getYear()); //dates are returned as javascript dates 
    console.log("Beatle height: %d' %d\"", Math.floor(row.height/12), row.height % 12); //integers are returned as javascript ints 
}); 

//fired after last row is emitted 
query.on('end', function() { 
    client.end(); 
}); 
+18

Questo è il tipo di esempio che mi piace vedere. Chiaro e comprensivo di codice sufficiente. Grazie JustBob. – Stradas

+1

Cosa hai aggiunto nel tuo pg_hba.conf per consentire le connessioni da node.js? Grazie –

+3

host tutto 0.0.0.0/0 md5 Questa voce sarà se ricordo di aver lasciato correttamente qualsiasi IP. Tieni presente che questo non è specifico del nodo, ma specifico di PostgreSQL. Anche in postgresql.conf ho listen_addresses = '*'. Per le impostazioni di produzione, leggi i documenti per assicurarti di non aprire buchi ovunque. Lo uso nella mia configurazione di sviluppo, quindi sto bene per consentire a qualsiasi macchina di connettersi. – Kuberchaun

10

Giusto per aggiungere una diversa opzione di - io uso Node-DBI di connettersi a PG, ma anche per la capacità di parlare a MySQL e sqlite. Node-DBI include anche funzionalità per costruire un'istruzione select, che è utile per fare cose dinamiche al volo.

campione rapido (utilizzando le informazioni di configurazione memorizzate in un altro file):

var DBWrapper = require('node-dbi').DBWrapper; 
var config = require('./config'); 

var dbConnectionConfig = { host:config.db.host, user:config.db.username, password:config.db.password, database:config.db.database }; 
var dbWrapper = new DBWrapper('pg', dbConnectionConfig); 
dbWrapper.connect(); 
dbWrapper.fetchAll(sql_query, null, function (err, result) { 
    if (!err) { 
    console.log("Data came back from the DB."); 
    } else { 
    console.log("DB returned an error: %s", err); 
    } 

    dbWrapper.close(function (close_err) { 
    if (close_err) { 
     console.log("Error while disconnecting: %s", close_err); 
    } 
    }); 
}); 

config.js:

var config = { 
    db:{ 
    host:"plop", 
    database:"musicbrainz", 
    username:"musicbrainz", 
    password:"musicbrainz" 
    }, 
} 
module.exports = config; 
+0

Ehi, mlaccetti, ho un problema simile cercando di connetterti ed eseguire test su un database SQLite3. Sto seguendo un tutorial con le istruzioni per utilizzare DBWrapper, motivo per cui ti sto contattando. La mia domanda è qui: http://stackoverflow.com/q/35803874/1735836 – Patricia

+0

Node-DBI è da tempo abbandonato e non più supportato. –

18

Un approccio semplice: pg-promise, se conosci con la promessa che è;)

var pgp = require('pg-promise')(/*options*/); 

var cn = { 
    host: 'localhost', // server name or IP address; 
    port: 5432, 
    database: 'myDatabase', 
    user: 'myUser', 
    password: 'myPassword' 
}; 
// alternative: 
// var cn = 'postgres://username:[email protected]:port/database'; 

var db = pgp(cn); // database instance; 

// select and return user name from id: 
db.one('SELECT name FROM users WHERE id = $1', 123) 
    .then(user => { 
     console.log(user.name); // print user name; 
    }) 
    .catch(error => { 
     console.log(error); // print the error; 
    }); 

Vedere anche: How to correctly declare your database module.

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – arulmr

+1

In un mondo ideale - sì, e tuttavia, la risposta accettata qui, come puoi vedere sopra - solo il link anche. Come in questo caso, sarebbe troppo per fare un riassunto dalle informazioni fornite dal collegamento, e considerando che entrambi i link sono dati ai repository pubblici di GitHub, le probabilità che si esauriscano non sono altro che le possibilità che StackOverflow diventi guasto . –

+0

Forse basta fornire un semplice esempio di utilizzo per qualcosa di molto semplice, che dovrebbe occupare solo poche righe ma sarebbe sufficiente per non renderlo solo link. –

1

Una soluzione può essere utilizzando pool dei clienti come la seguente:

const pg = require('pg'); 
var config = { 
    user: 'foo', 
    database: 'my_db', 
    password: 'secret', 
    host: 'localhost', 
    port: 5432, 
    max: 10, // max number of clients in the pool 
    idleTimeoutMillis: 30000 
}; 

pool.on('error', function (err, client) { 
    console.error('idle client error', err.message, err.stack); 
}); 
pool.query('SELECT $1::int AS number', ['2'], function(err, res) { 
    if(err) { 
     return console.error('error running query', err); 
    } 
    console.log('number:', res.rows[0].number); 
}); 

si possono vedere più dettagli su this resource.

Problemi correlati