Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Postgres precisando abrir a conexão antes de executar

1º Dúvida: Estou usando o postgres, e antes de exe um this._conexao.connect() antes da query. Existe alguma configuração para ficar igual o MYSQL ou é uma característica do postgres ?

function ProdutosDAO(conexao){
  this._conexao = conexao;
}

ProdutosDAO.prototype.lista = function(callback){
  this._conexao.connect();  // no mysql ele abre direto
  this._conexao.query('select * from produtos', callback);
}

module.exports = function(){
  return ProdutosDAO;
}

2ª Dúvida: Se for preciso no postgres fazer o connect() toda vez, eu poderia usar esse comando logo no início da classe ou melhor deixar somente antes de executar a query ?

function ProdutosDAO(conexao){
  this._conexao = conexao;
  this._conexao.connect();  // abrir aqui somente uma vez
}

ProdutosDAO.prototype.lista = function(callback){
  this._conexao.query('select * from produtos', callback);
}

module.exports = function(){
  return ProdutosDAO;
}
5 respostas

Oi Jaime, tudo bem? Vamos lá:

1º - Não entendi. Com o MySQL você ainda vai precisar usar o .connect() até onde sei.

2º - É no mínimo uma boa ideia, mas ela tem um problema. Todas as aberturas de conexão, são fechadas em algum lugar. Se você abrir só uma vez, quer dizer que provavelmente você nunca vai fechar? E se você fechar, como vai abrir de novo caso faça mais de uma operação em lugares diferentes?

Quanto a 2a. pergunta vc está certo, numa segunda chamada dá erro pq a conexão já foi encerrada.

Quanto a 1a. pergunda, no mysql o sql funciona sem uso do this.conexao.connect():

ProdutosDAO.prototype.lista = function(callback){
  this._conexao.query('select * from produtos', callback);
}

No Postgres preciso por .connect() senão só fica aguardando e não traz os dados. Tem alguma configuração para revover esse .connect(), ficar automático igual o mysql ?

ProdutosDAO.prototype.lista = function(callback){
  this._conexao.connect();  // no postgres sem essa linha não funciona
  this._conexao.query('select * from produtos', callback);
}

Se possível deve haver sim algo na documentação do pacote que você está usando. Poderia me dizer qual é o pacote pra mim verificar?

Desculpa mas onde eu verifico ou encontro esse pacote ? Se for como estou fazendo a conexão, segue o código:

var pg = require("pg");
// FACTORY METHOD
function createDBConnection(){
  var conString = process.env.DATABASE_URL || "postgres://postgres:ADMIN@localhost:5432/MEUBANCO";
  var conexao = new pg.Client(conString);
  return conexao;
};

module.exports = function(){
  return createDBConnection;
};
solução!

Oi Jaime, esse me parece o pg package, já que você está usando apenas pg no require.

Olhando a documentação do pacote do MySQL. Tem uma observação dizendo: "a connection can also be implicitly established by invoking a query"

Ou seja, usar o db.query direto, abre uma conexão implícita. O pacote é quem cuida de abrir essa conexão caso você não tenha aberto ela antes.

Já na documentação do pg, não temos nada desse tipo. Nem mesmo dicas de como configurar isso. No máximo, eles disponibilizam um pool de conexões. Ou seja, você configura um número de conexões que podem ser utilizadas e conforme for preciso, sua aplicação usa umas das conexões pré-configuradas.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software