Я автор node-postgres . Во-первых, я прошу прощения, что в документации не указан правильный вариант: это моя вина. Постараюсь улучшить. Я только что написал Gist, чтобы объяснить это, потому что разговор стал слишком длинным для Twitter.
Использование pg.connect
- это путь в веб-среде.
Сервер PostgreSQL может обрабатывать только 1 запрос за раз за одно соединение. Это означает, что если у вас есть 1 глобальный new pg.Client()
сервер, подключенный к вашему бэкэнду, все ваше приложение будет узким местом в зависимости от того, насколько быстро postgres может отвечать на запросы. Он буквально выстраивает все в очередь, ставя каждый запрос в очередь. Да, это асинхронно, и это нормально ... но не лучше ли умножить пропускную способность в 10 раз? Используйте, чтобы pg.connect
установить что-
pg.defaults.poolSize
нибудь вменяемое (мы делаем 25-100, пока не уверены в правильности числа).
new pg.Client
когда вы знаете, что делаете. Когда вам по какой-то причине нужен один-единственный долгоживущий клиент или вам нужно очень тщательно контролировать жизненный цикл. Хороший пример этого - использование
LISTEN/NOTIFY
. Слушающий клиент должен быть поблизости и подключен, а не использоваться совместно, чтобы он мог правильно обрабатывать NOTIFY
сообщения. Другим примером может быть открытие одноразового клиента для уничтожения зависшего или в сценариях командной строки.
Одна очень полезная вещь - централизовать весь доступ к вашей базе данных в вашем приложении в один файл. Не мешайте pg.connect
звонкам или новым клиентам. Пусть такой файл db.js
выглядит примерно так:
module.exports = {
query: function(text, values, cb) {
pg.connect(function(err, client, done) {
client.query(text, values, function(err, result) {
done();
cb(err, result);
})
});
}
}
Таким образом, вы можете изменить свою реализацию pg.connect
на настраиваемый пул клиентов или что-то еще, и вам нужно будет изменить что-то только в одном месте.
Взгляните на модуль node-pg-query, который делает именно это.
Я автор pg-prom , который упрощает использование node-postgres с помощью обещаний.
Он решает вопросы о правильном способе подключения и отключения от базы данных, используя пул соединений, реализованный node-postgres , среди прочего, например, автоматические транзакции.
Индивидуальный запрос в pg-обещании сводится к тому, что имеет отношение к вашей бизнес-логике:
то есть вам не нужно иметь дело с логикой соединения при выполнении запросов, потому что вы устанавливаете соединение только один раз, глобально, например:
Вы можете найти много других примеров в учебном пособии « Обучение на примерах» или на домашней странице проекта .
источник
pg
этом указываетсяpg.defaults.ssl = true;
. Как это сделатьpg-promise
?pgp.pg.defaults.ssl = true;
Бассейн - это то, что вам нужно.
его можно использовать как
db.query('<BEGIN,COMMIT,ROLLBACK,your query,anything')
источник
Лучше создать пул pg глобально, и каждый раз, когда вам нужно выполнить операцию с базой данных, используйте клиента, а затем возвращайте его в пул. Как только все операции с базами данных будут выполнены, завершите пул, используя
pool.end()
Образец кода -
Для получения дополнительной информации вы можете обратиться к моему сообщению в блоге - Источник
источник
Как видно из документации , действительны оба варианта, поэтому выберите тот, который вам больше нравится. Как и вы, я бы выбрал второй вариант.
источник
Меня заинтересовал очень простой обработчик для этого, поэтому я сделал свой собственный, не усложняя его. Я не питаю иллюзий, что это супер простой, но он может помочь некоторым людям начать работу. По сути, он подключается, выполняет запросы и обрабатывает ошибки за вас.
Тогда вы могли бы использовать, назвав его так:
источник
node-postgres
странице подходит лучше этого.Вот как я это делаю, своего рода «все вышеперечисленное»
источник