Node.js के माध्यम से Postgres से संबंध कैसे बनाएं


123

मैं खुद को एक पोस्टग्रेज डेटाबेस बनाने की कोशिश कर रहा हूं, इसलिए मैंने पोस्टग्रेज स्थापित किए और एक सर्वर के साथ शुरू किया initdb /usr/local/pgsql/data, फिर मैंने उस उदाहरण के साथ शुरू किया postgres -D /usr/local/pgsql/dataअब मैं नोड के माध्यम से इसके साथ कैसे बातचीत कर सकता हूं? उदाहरण के लिए, क्या होगा connectionstring, या मैं कैसे पता लगा सकता हूं कि यह क्या है।

जवाबों:


313

यहाँ एक उदाहरण है जो मैंने अपने पोस्टग्रेज डेटाबेस के लिए नोड.जेएस को जोड़ने के लिए उपयोग किया था।

नोड.जेएस में उपयोग किया जाने वाला इंटरफ़ेस यहां पाया जा सकता है https://github.com/brianc/node-postgres

var pg = require('pg');
var conString = "postgres://YourUserName:YourPassword@localhost: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();
});

अद्यतन: - query.onसमारोह अब पदावनत है और इसलिए उपरोक्त कोड के रूप में काम नहीं करेगा। इस पर एक समाधान के रूप में देखो: - query.on एक फ़ंक्शन नहीं है


24
अब उदाहरण के प्रकार मैं देखना पसंद करता है। पर्याप्त कोड के स्पष्ट और समावेशी। थैंक्स जस्टबैंक।
चरणदास

1
आपने अपने pg_hba.conf में नोड.जेएस से कनेक्शन की अनुमति के लिए क्या जोड़ा? धन्यवाद
मेरियस

3
सभी को 0.0.0.0/0 md5 होस्ट करें यह प्रविष्टि अगर मुझे सही से याद है तो किसी भी आईपी को कनेक्ट करने दें। ध्यान रखें कि यह नोड विशिष्ट नहीं है, लेकिन PostgreSQL विशिष्ट है। इसके अलावा postgresql.conf में मेरे पास_ड्रेस्रेस = '*' है। उत्पादन सेटअप के लिए कृपया डॉक्स को पढ़ें ताकि यह सुनिश्चित हो सके कि आप कहीं भी छेद नहीं खोल रहे हैं। मैं अपने देव सेटअप में इसका उपयोग करता हूं इसलिए मैं किसी भी मशीन कनेक्ट की अनुमति देने में ठीक हूं।
कुबेरचुन

1
कॉनस्ट्रिंग स्पेलिंग का पैरामीटर जीनियस है, और बस मैं जो ढूंढ रहा था। धन्यवाद!
nelsonenzo


33

एक आधुनिक और सरल दृष्टिकोण: पीजी-वादा :

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

const cn = {
    host: 'localhost', // server name or IP address;
    port: 5432,
    database: 'myDatabase',
    user: 'myUser',
    password: 'myPassword'
};

// alternative:
// var cn = 'postgres://username:password@host:port/database';

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

// select and return a single 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;
    });

// alternative - new ES7 syntax with 'await':
// await db.one('SELECT name FROM users WHERE id = $1', [123]);

यह भी देखें: अपने डेटाबेस मॉड्यूल को सही ढंग से कैसे घोषित करें


हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
अरुलमर

1
एक आदर्श दुनिया में - हां, और फिर भी, यहां स्वीकृत उत्तर, जैसा कि आप ऊपर देख सकते हैं - बस लिंक भी। वहाँ के रूप में ही, यह लिंक प्रदान की गई जानकारी से एक सार बनाने के लिए बहुत अधिक होगा, और यह देखते हुए कि दोनों लिंक GitHub के सार्वजनिक रिपॉजिटरी में दिए गए हैं, उनके मृत होने की संभावना StackOfflow के लिए मृत होने की संभावना से अधिक नहीं है। ।
महत्वपूर्ण-5

हो सकता है कि यह बहुत ही बुनियादी कुछ के लिए इसका उपयोग करने का एक सरल उदाहरण प्रदान करता है, जो केवल कुछ पंक्तियों को लेना चाहिए, लेकिन यह केवल लिंक करने के लिए पर्याप्त नहीं होगा।
क्ंतास 94 हेवी

@ Qantas94Heavy, और मैंने अभी किया, इसे डाउन-वोटिंग पर रोक दिया :)
महत्वपूर्ण-टीआर

@ महत्वपूर्ण-टी: किसी ने संभवतः पोस्ट को "बहुत कम गुणवत्ता" के रूप में चिह्नित किया है, जो ध्वज को संभालने से पहले पोस्ट को संपादित या हटाए जाने पर स्वचालित डाउनवोट देता है।
क्ंतास 94 हेवी

12

बस एक अलग विकल्प जोड़ने के लिए - मैं नोड-डीबीआई का उपयोग करता हूं पीजी से कनेक्ट करने के लिए का , लेकिन यह भी MySQL और sqlite से बात करने की क्षमता के कारण। नोड-डीबीआई में चयन स्टेटमेंट बनाने के लिए कार्यक्षमता भी शामिल है, जो मक्खी पर गतिशील सामान करने के लिए आसान है।

त्वरित नमूना (किसी अन्य फ़ाइल में संग्रहीत जानकारी का उपयोग करके):

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;

अरे, mlaccetti, मेरे पास SQLite3 डेटाबेस के खिलाफ परीक्षणों को जोड़ने और चलाने की कोशिश करने वाला एक समान मुद्दा है। मैं DBWrapper का उपयोग करने के निर्देशों के साथ एक ट्यूटोरियल से गुजर रहा हूं, यही वजह है कि मैं आप तक पहुंच रहा हूं। मेरा सवाल यहाँ है: stackoverflow.com/q/35803874/1735836
पेट्रीसिया

नोड-डीबीआई को लंबे समय से छोड़ दिया गया है, और अब समर्थित नहीं है।
महत्वपूर्ण-टी

2

एक समाधान poolनिम्नलिखित की तरह ग्राहकों का उपयोग किया जा सकता है :

const { Pool } = 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
};
const pool = new Pool(config);
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);
});

आप इस संसाधन पर अधिक विवरण देख सकते हैं ।


आपने 'config' का उपयोग नहीं किया।
LEMUEL ADANE

1

स्लोनिक कुबेरचुन और विटाली द्वारा प्रस्तावित उत्तरों का एक विकल्प है।

स्लोनिक लागू सुरक्षित कनेक्शन हैंडलिंग ; आप एक कनेक्शन पूल बनाते हैं और कनेक्शन ओपनिंग / हैंडलिंग आपके लिए संभाला जाता है।

import {
  createPool,
  sql
} from 'slonik';

const pool = createPool('postgres://user:password@host:port/database');

return pool.connect((connection) => {
  // You are now connected to the database.
  return connection.query(sql`SELECT foo()`);
})
  .then(() => {
    // You are no longer connected to the database.
  });

postgres://user:password@host:port/database आपका कनेक्शन स्ट्रिंग (या अधिक कैनोनिकली कनेक्शन URI या DSN) है।

इस दृष्टिकोण का लाभ यह है कि आपकी स्क्रिप्ट यह सुनिश्चित करती है कि आप गलती से कभी भी हैंगिंग कनेक्शन न छोड़ें।

स्लोनिक का उपयोग करने के अन्य लाभों में शामिल हैं:


0

हम postgresql-easy का भी उपयोग कर सकते हैं । यह नोड-पोस्टग्रेज और स्क्क्लुटिल पर बनाया गया हैनोट: pg_connection.js और your_handler.js एक ही फ़ोल्डर में हैं। db.js को कॉन्फ़िगर किए गए फ़ोल्डर में है।

pg_connection.js

const PgConnection = require('postgresql-easy');
const dbConfig = require('./config/db');
const pg = new PgConnection(dbConfig);
module.exports = pg;

./config/db.js

module.exports =  {
  database: 'your db',
  host: 'your host',
  port: 'your port',
  user: 'your user',
  password: 'your pwd',
}

your_handler.js

  const pg_conctn = require('./pg_connection');

  pg_conctn.getAll('your table')
    .then(res => {
         doResponseHandlingstuff();
      })
    .catch(e => {
         doErrorHandlingStuff()     
      })
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.