Node.js aracılığıyla Postgres'e nasıl bağlantı yapılır?


123

Kendimi bir postgres veritabanı oluşturmaya çalışırken buluyorum, bu yüzden postgres yükledim ve bir sunucu başlattım initdb /usr/local/pgsql/data, sonra bu örneği postgres -D /usr/local/pgsql/dataşimdi başlattım, bununla düğüm aracılığıyla nasıl etkileşim kurabilirim? Örneğin, ne olurdu connectionstringya da ne olduğunu nasıl bulabilirim.

Yanıtlar:


313

İşte node.js'yi Postgres veritabanıma bağlamak için kullandığım bir örnek.

Kullandığım node.js'deki arayüz burada https://github.com/brianc/node-postgres bulunabilir.

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();
});

GÜNCELLEME: - query.onİşlev artık kullanımdan kaldırılmıştır ve bu nedenle yukarıdaki kod amaçlandığı gibi çalışmayacaktır. Bunun çözümü için şuna bakın: - query.on bir işlev değil


24
İşte görmeyi sevdiğim türden örnek bu. Açık ve yeterli kod içeren. Teşekkürler JustBob.
Stradas

1
Node.js'den bağlantılara izin vermek için pg_hba.conf dosyanıza ne eklediniz? Teşekkürler
Marius

3
tümü 0.0.0.0/0 md5'i barındır Bu giriş, doğru hatırlıyorsam herhangi bir IP'nin bağlanmasına izin verecektir. Bunun düğüme özgü olmadığını, ancak PostgreSQL'e özgü olduğunu unutmayın. Ayrıca postgresql.conf'ta listen_addresses = '*' var. Üretim kurulumları için, hiçbir yerde delik açmadığınızdan emin olmak için lütfen belgeleri baştan sona okuyun. Bunu geliştirici kurulumumda kullanıyorum, bu yüzden herhangi bir makine bağlantısına izin verme konusunda iyiyim.
Kuberchaun

1
Yazılan conString parametreleri dahice ve tam da aradığım şey. Teşekkür ederim!
nelsonenzo


33

Modern ve basit bir yaklaşım: pg-promise :

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]);

Ayrıca bkz: Veritabanı modülünüzü nasıl doğru bir şekilde bildirebilirsiniz .


Bu bağlantı soruyu yanıtlasa da, cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak daha iyidir. Bağlantılı sayfa değişirse yalnızca bağlantı yanıtları geçersiz hale gelebilir.
arulmr

1
İdeal bir dünyada - evet, ama yine de yukarıda gördüğünüz gibi burada kabul edilen cevap - sadece bağlantı da. Orada olduğu gibi, bağlantının sağladığı bilgilerden bir özet yapmak çok fazla olurdu ve her iki bağlantının da GitHub'ın herkese açık depolarına verildiğini düşünürsek, onların ölme şansı StackOverflow'un ölme olasılığından daha fazla değildir. .
vitaly-t 4'15

Belki de onu çok basit bir şey için kullanmanın basit bir örneğini verelim, bu sadece birkaç satır almalı, ancak onu yalnızca bağlantılı hale getirmemesi için yeterli olacaktır.
Qantas 94 Heavy

@ Qantas94Heavy, ve az önce yaptım, aşağı oylama için
bekletin

@ vitaly-t: Biri muhtemelen gönderiyi "çok düşük kaliteli" olarak işaretlemiştir, bu da gönderi işaretlenmeden önce düzenlenir veya silinirse otomatik olarak olumsuz oy verir.
Qantas 94 Heavy

12

Sadece farklı bir seçenek eklemek için - PG'ye bağlanmak için Node-DBI kullanıyorum , ama aynı zamanda MySQL ve sqlite ile konuşma yeteneği nedeniyle. Düğüm-DBI ayrıca, anında dinamik şeyler yapmak için kullanışlı olan bir seçme ifadesi oluşturma işlevi de içerir.

Hızlı örnek (başka bir dosyada depolanan yapılandırma bilgilerini kullanarak):

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;

Hey, mlaccetti, bir SQLite3 veritabanına bağlanmaya ve testleri çalıştırmaya çalışırken benzer bir sorun yaşıyorum. DBWrapper'ı kullanma talimatlarını içeren bir eğitimden geçiyorum, bu yüzden size ulaşıyorum. Sorum şu: stackoverflow.com/q/35803874/1735836
Patricia

Düğüm DBI, o zamandan beri uzun süredir terk edilmiş durumda ve artık desteklenmiyor.
vitaly-t

3

Çözümlerden biri pool, aşağıdaki gibi istemcileri kullanmak olabilir :

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);
});

Bu kaynakla ilgili daha fazla ayrıntı görebilirsiniz .


'config' kullanmadınız.
LEMUEL ADANE

1

Slonik , Kuberchaun ve Vitaly tarafından önerilen cevaplara bir alternatiftir.

Slonik güvenli bağlantı yönetimi uygular ; bir bağlantı havuzu oluşturursunuz ve bağlantı açma / işleme sizin için halledilir.

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 bağlantı dizenizdir (veya daha çok kurallı olarak bir bağlantı URI'si veya DSN'si).

Bu yaklaşımın yararı, betiğinizin asla yanlışlıkla asılı bağlantıları bırakmamanızı sağlamasıdır.

Slonik kullanmanın diğer faydaları şunlardır:


0

Postgresql-easy'ı da kullanabiliriz . Node-postgres ve sqlutil üzerine inşa edilmiştir . Not: pg_connection.js ve your_handler.js aynı klasördedir. db.js , yerleştirilen yapılandırma klasöründedir.

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()     
      })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.