programing

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

newsource 2023. 5. 25. 22:07

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

Postgres 데이터베이스를 작성하려고 시도하는 자신을 발견하여 Postgres를 설치하고 서버를 시작했습니다.initdb /usr/local/pgsql/data그리고 나서 저는 그 인스턴스를 시작했습니다.postgres -D /usr/local/pgsql/data이제 어떻게 이 스루 노드와 상호 작용할 수 있습니까?예를 들어, 무엇이.connectionstring그게 뭔지 어떻게 알아낼 수 있죠?

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

제가 사용한 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은 함수가 아닙니다.

현대적이고 간단한 접근 방식: pg-약속:

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

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

다른 옵션을 추가하기 위해 - Node-DBI를 사용하여 PG에 연결하지만 MySQL 및 sqlite와 대화할 수 있기 때문입니다.노드-DBI에는 선택 문을 작성하는 기능도 포함되어 있어 동적인 작업을 신속하게 수행하는 데 유용합니다.

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

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;

단일 솔루션을 사용할 수 있습니다.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);
});

리소스에 대한 자세한 정보를 볼 수 있습니다.

연결 문자열

연결 문자열은 다음 형식의 문자열입니다.

postgres://[user[:password]@][host][:port][/dbname]

(부품 위치)[...]선택적으로 포함하거나 제외할 수 있음)

유효한 연결 문자열의 예는 다음과 같습니다.

postgres://localhost
postgres://localhost:5432
postgres://localhost/mydb
postgres://user@localhost
postgres://user:secret_password@localhost

로컬 컴퓨터에서 데이터베이스를 시작한 경우 연결 문자열postgres://localhost는 기본 포트 번호, 사용자 이름 및 암호를 사용하지 않으므로 일반적으로 작동합니다.데이터베이스가 특정 계정으로 시작된 경우 사용해야 할 수 있습니다.postgres://pg@localhost또는postgres://postgres@localhost

이러한 작업이 모두 수행되지 않고 도커를 설치한 경우 다른 옵션을 실행하는 것이 좋습니다.npx @databases/pg-test start이렇게 하면 도커 컨테이너에서 postgres 서버가 시작되고 연결 문자열이 인쇄됩니다.pg-test데이터베이스는 테스트용으로만 사용되므로 컴퓨터를 다시 시작하면 모든 데이터가 손실됩니다.

node.js에서 연결 중

다음을 사용하여 데이터베이스에 연결하고 쿼리를 실행할 수 있습니다.@databases/pg:

const createPool = require('@databases/pg');
const {sql} = require('@databases/pg');

// If you're using TypeScript or Babel, you can swap
// the two `require` calls for this import statement:

// import createPool, {sql} from '@databases/pg';

// create a "pool" of connections, you can think of this as a single
// connection, the pool is just used behind the scenes to improve
// performance
const db = createPool('postgres://localhost');

// wrap code in an `async` function so we can use `await`
async function run() {

  // we can run sql by tagging it as "sql" and then passing it to db.query
  await db.query(sql`
    CREATE TABLE IF NOT EXISTS beatles (
      name TEXT NOT NULL,
      height INT NOT NULL,
      birthday DATE NOT NULL
    );
  `);

  const beatle = {
    name: 'George',
    height: 70,
    birthday: new Date(1946, 02, 14),
  };

  // If we need to pass values, we can use ${...} and they will
  // be safely & securely escaped for us
  await db.query(sql`
    INSERT INTO beatles (name, height, birthday)
    VALUES (${beatle.name}, ${beatle.height}, ${beatle.birthday});
  `);

  console.log(
    await db.query(sql`SELECT * FROM beatles;`)
  );
}

run().catch(ex => {
  // It's a good idea to always report errors using
  // `console.error` and set the process.exitCode if
  // you're calling an async function at the top level
  console.error(ex);
  process.exitCode = 1;
}).then(() => {
  // For this little demonstration, we'll dispose of the
  // connection pool when we're done, so that the process
  // exists. If you're building a web server/backend API
  // you probably never need to call this.
  return db.dispose();
});

node.js를 사용하여 Postgres를 쿼리하는 방법에 대한 자세한 가이드는 https://www.atdatabases.org/docs/pg 에서 찾을 수 있습니다.

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

이 방법의 이점은 스크립트가 실수로 연결을 끊지 않도록 보장한다는 것입니다.

슬론익을 사용하면 다음과 같은 이점이 있습니다.

postgresql-easy를 사용할 수도 있습니다.node-postgressqlutil을 기반으로 합니다.참고: pg_connection.jsyour_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',
}

너의_js.js

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

  pg_conctn.getAll('your table')
    .then(res => {
         doResponseHandlingstuff();
      })
    .catch(e => {
         doErrorHandlingStuff()     
      })

언급URL : https://stackoverflow.com/questions/9205496/how-to-make-connection-to-postgres-via-node-js