Node.js를 통해 Postgres에 연결하는 방법


123

postgres 데이터베이스를 만들려고했기 때문에 postgres를 설치하고를 사용하여 서버를 initdb /usr/local/pgsql/data시작한 다음 해당 인스턴스를 시작했습니다. postgres -D /usr/local/pgsql/data이제 노드를 통해이 인스턴스와 상호 작용할 수 있습니까? 예를 들어, 무엇인지 connectionstring또는 그것이 무엇인지 어떻게 알 수 있습니까?

답변:


313

다음은 node.js를 Postgres 데이터베이스에 연결하는 데 사용한 예입니다.

내가 사용한 node.js의 인터페이스는 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
이제 제가보기를 좋아하는 유형의 예입니다. 충분한 코드를 명확하고 포함합니다. 고마워 JustBob.
Stradas

1
node.js에서 연결을 허용하기 위해 pg_hba.conf에 무엇을 추가 했습니까? 감사합니다
Marius

3
모두 모두 호스트 0.0.0.0/0 md5이 항목은 내가 올바르게 기억하면 IP 연결을 허용합니다. 이것은 노드에 한정되지 않고 PostgreSQL에 한정됩니다. 또한 postgresql.conf에는 listen_addresses = '*'가 있습니다. 프로덕션 설정의 경우 문서를 읽고 어디에도 구멍을 열지 않는지 확인하십시오. 내 dev 설정에서 이것을 사용하므로 모든 컴퓨터 연결을 허용하는 것이 좋습니다.
Kuberchaun

1
설명 된 conString 매개 변수는 천재적이며 제가 찾던 것입니다. 감사합니다!
nelsonenzo


33

현대적이고 간단한 접근 방식 : 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]);

참조 : 데이터베이스 모듈을 올바르게 선언하는 방법 .


이 링크가 질문에 답할 수 있지만 여기에 답변의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 무효화 될 수 있습니다.
arulmr 2015-04-04

1
이상적인 세계에서-예, 그러나 위에서 볼 수 있듯이 여기에서 허용되는 대답은 링크뿐입니다. 거기에서와 마찬가지로 링크가 제공하는 정보에서 초록을 만드는 것은 너무 많을 것이고 두 링크가 GitHub의 공용 저장소에 제공된다는 점을 고려할 때 이들이 죽을 가능성은 StackOverflow가 죽을 가능성에 지나지 않습니다. .
vitaly-t

아주 기본적인 것을 사용하는 간단한 예제를 제공 할 수 있습니다. 몇 줄만 사용하면되지만 링크 전용으로 만들지는 않을 것입니다.
Qantas 94 Heavy

Qantas94Heavy @, 난 그냥 :) 다운 투표에 그것을 보류 않았다
비탈리-t

@ vitaly-t : 누군가 게시물을 "매우 낮은 품질"로 표시하여 플래그가 처리되기 전에 게시물이 편집되거나 삭제되면 자동으로 반대표를 표시합니다.
Qantas 94 Heavy

12

다른 옵션을 추가하기 위해 Node-DBI 를 사용하여 PG에 연결하지만 MySQL 및 sqlite와 대화 할 수있는 기능도 있습니다. Node-DBI에는 동적 작업을 즉석에서 수행하는 데 편리한 select 문을 작성하는 기능도 포함되어 있습니다.

빠른 샘플 (다른 파일에 저장된 구성 정보 사용) :

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
패트리샤

Node-DBI는 그 이후로 오랫동안 폐기되었으며 더 이상 지원되지 않습니다.
vitaly-t

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

Slonik 은 Kuberchaun과 Vitaly가 제안한 답변의 대안입니다.

Slonik은 안전한 연결 처리를 구현 합니다 . 연결 풀을 만들고 연결 열기 / 처리가 자동으로 처리됩니다.

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)입니다.

이 접근 방식의 이점은 스크립트가 실수로 중단 된 연결을 떠나지 않도록하는 것입니다.

Slonik 사용의 다른 이점은 다음과 같습니다.


0

postgresql-easy를 사용할 수도 있습니다 . node-postgressqlutil 에 빌드됩니다 . 참고 : pg_connection.jsyour_handler.js 는 동일한 폴더에 있습니다. db.js 는 config 폴더에 있습니다.

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()     
      })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.