답변:
다음은 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은 함수가 아닙니다.
현대적이고 간단한 접근 방식 : 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]);
참조 : 데이터베이스 모듈을 올바르게 선언하는 방법 .
다른 옵션을 추가하기 위해 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;
한 가지 해결책은 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);
});
이 리소스 에 대한 자세한 내용을 볼 수 있습니다 .
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 사용의 다른 이점은 다음과 같습니다.
postgresql-easy를 사용할 수도 있습니다 . node-postgres 및 sqlutil 에 빌드됩니다 . 참고 : pg_connection.js 및 your_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()
})