Conexão com multiplos banco de dados

625 views
Skip to first unread message

Alexandre Carmo

unread,
May 20, 2014, 12:32:36 PM5/20/14
to nod...@googlegroups.com
Boa tarde a todos.

Pessoal estou desenvolvendo um projeto com o node + sequelize + mysql, um projeto de médio porte, estou apanhando um pouco por ser o primeiro projeto real em node que estou fazendo, esse projeto um uma estrutura de banco de dados já pronta em mysql.
Para manipular o banco de dados uso o sequelize para gerenciar as models e nos controllers eu uso o active record que o sequelize fornece para fazer as requisições. Até aqui com alguns pequenos problemas mas estou resolvendo aos poucos.
Porém sugiu um problema a aplicação irá precisar conectar mais de um banco de dados, ou seja algumas models de tabelas estarão  respondendo a banco de dados diferentes, a aplicação possui um banco de dados principal porém algumas informações estarão em outro banco de dados.

É possível fazer esse tipo de comunicação com o node?

principe...@gmail.com

unread,
May 20, 2014, 12:42:21 PM5/20/14
to nod...@googlegroups.com
sim, perfeitamente, assim como em qq outra linguagem....


--
Você recebeu essa mensagem porque está inscrito no grupo quot;Node.js Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nodebr+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Alexandre Carmo

unread,
May 20, 2014, 12:48:26 PM5/20/14
to nod...@googlegroups.com
Obrigado pela atenção.

Você tem alguma ideia de como fazer isso?

Analisando aqui minha aplicação usando o sequelize e express trabalha com a estrutura MVC, logo dentro da pasta models eu tengo todas as models e um arquivo index.js onde eu aponto dentro dele as models existentes e aponto o banco de dados, então no controller basta eu chamar uam model e usar.
O arquivo index.js esta dessa forma:

var Sequelize = require('sequelize'),
    config    = require(__dirname + '/../../config/database.json');

//initialyze sequelize
var sequelize = new Sequelize(config.development.database, config.development.username, config.development.password, {
  host   : config.development.host,
  charset:'utf8',
  collate:'utf8_general_ci',
  logging: false
});

//load models
var models = ['Usuarios','Clientes','Produtos'];
models.forEach(function(model) { module.exports[model] = sequelize.import(__dirname + '/' + model); });

//run migrations
sequelize.sync();

//exports the connection
module.exports.sequelize = sequelize;

Então no controller basta fazer isso por exemplo:

var models    = require(__dirname + '/../models/');
models.Usuarios.create(data).success(function(user) { console.log(user); })
                    .error(function(errors) {
                          console.log(errors);
                                console.log(errors.code);
                    });

Como fazer agora essa separação de models com seu determinado banco de dados?

Alan Hoffmeister

unread,
May 20, 2014, 12:53:16 PM5/20/14
to nod...@googlegroups.com
Faz tempo que não mexo com o MySQL, mas teoricamente você apenas teria
que instanciar uma conexão para cada bando de dados...

https://gist.github.com/alanhoff/f584531112f5937593a6
--
Att,
Alan Hoffmeister


Em 20 de maio de 2014 13:42, principe...@gmail.com
<principe...@gmail.com> escreveu:

Alexandre Carmo

unread,
May 20, 2014, 1:04:25 PM5/20/14
to nod...@googlegroups.com
Boa tarde Alan.

Cara vendo o seu link, tive uma ideia ainda não tive como testar mas vou expor aqui para receber opinião sua e de quem mais quiser passar será muito bem vinda.
Seria o seguinte
1) Ter as conexões de cada banco de dados claro conforme seu link,
2) Criar uma diretório para os models de cada banco de dados

A estrutura do arquivo index, ficaria da seguinte forma:


var Sequelize = require('sequelize'),
    config    = require(__dirname + '/../../config/database.json');
    config_db2    = require(__dirname + '/../../config/database.json');

//initialyze sequelize
var sequelize = new Sequelize(config.db.database, config.db.username, config.db.password, {
  host   : config.db.host,

  charset:'utf8',
  collate:'utf8_general_ci',
  logging: false
});

var sequelize_db2 = new Sequelize(config.db2.database, config.db2.username, config.db2.password, {
  host   : config.db2.host,

  charset:'utf8',
  collate:'utf8_general_ci',
  logging: false
});

//load models
var models = ['Usuarios','Cliente','Produtos'];

models.forEach(function(model) { module.exports[model] = sequelize.import(__dirname + '/' + model); });

var models2 = ['XX','VV','AA'];
models2.forEach(function(model) { module.exports[model] = sequelize_db2.import(__dirname + '../models_db2' + model); });



//run migrations
sequelize.sync();
sequelize_db2.sync();


//exports the connection
module.exports.sequelize = sequelize;
module.exports.sequelize = sequelize_db2;

Será que isso funcionaria?

Alexandre Carmo

unread,
May 20, 2014, 5:01:37 PM5/20/14
to nod...@googlegroups.com
Pessoal resolvi o problema, funcionou, não sei se é a melhor forma se alguém tiver uma forma melhor por favor adiciona aqui, fiz o seguinte:


var Sequelize = require('sequelize'),
    config    = require(__dirname + '/../../config/database.json');

//initialyze sequelize
var sequelize = new Sequelize(config.db1.database, config.db1.username, config.db1.password, {
  host   : config.development.host,

  charset:'utf8',
  collate:'utf8_general_ci',
  logging: false
});

var sequelize2 = new Sequelize(config.db2.database, config.db2.username, config.db2.password, {
  host   : config.development.host,

  charset:'utf8',
  collate:'utf8_general_ci',
  logging: false
});

//load models
var models = ['Users'];

models.forEach(function(model) { module.exports[model] = sequelize.import(__dirname + '/' + model); });
models.forEach(function(model) { module.exports[model] = sequelize2.import(__dirname + '/' + model); });


//exports the connection
module.exports.sequelize = sequelize;
module.exports.sequelize = sequelize2;

Fábio Elísio

unread,
May 21, 2014, 8:17:41 AM5/21/14
to nod...@googlegroups.com
Aproveitando a deixa do papo de banco tem como eu me conectar no SQL Server tambem? to com um banco legado aqui e queria fazer o sistema com node tambem. :)


--
Você recebeu essa mensagem porque está inscrito no grupo quot;Node.js Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nodebr+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
dev_web = {
    name : Fábio Elisio,
    profession : Front End developer,
    twitter : @felisio
}

Programming in HTML5 with JavaScript and CSS3 Specialist (MCP 70-480)

principe...@gmail.com

unread,
May 21, 2014, 8:18:30 AM5/21/14
to nod...@googlegroups.com
se eu nao me engano o sequelize nao conecta no sqlserver, mas deve ter driver tb...um outro orm...

Alexandre Carmo

unread,
May 21, 2014, 8:46:45 AM5/21/14
to nod...@googlegroups.com
Bom dia a todos

Sim o node trabalha com o SQL Server normalmente, também é suportado no Windows Azure, a microsoft esta investindo bastante nisso. Abaixo segue os links que passam a informação que você precisa:

http://blog.codeship.io/2014/04/22/leverage-sql-server-with-node-js-using-edge-js.html
http://www.infoq.com/br/news/2012/07/nodejs-sqlserver-webmatrix
http://stackoverflow.com/questions/5156806/node-js-and-microsoft-sql-server

principe...@gmail.com

unread,
May 21, 2014, 9:01:04 AM5/21/14
to nod...@googlegroups.com
"Sim o node trabalha com o SQL Server"..


"se eu nao me engano o sequelize nao conecta no sqlserver, mas deve ter driver tb...um outro orm..."

sim o node tem, mas nao o sequelize, a orm usada em questao...


--

Alexandre Carmo

unread,
May 21, 2014, 9:04:12 AM5/21/14
to nod...@googlegroups.com
Isso mesmo cara é como você falo o sequelize não atendo o mysql, um dos que atende é o  Edge.js

principe...@gmail.com

unread,
May 21, 2014, 9:10:00 AM5/21/14
to nod...@googlegroups.com
eh tanto sql...o sequelize atende ao mysql, mas nao ao sql server...mas blz...obrigado pela dica...


--

Fábio Elísio

unread,
May 21, 2014, 11:21:48 AM5/21/14
to nod...@googlegroups.com
Valeu pela Dica galera. Aquele abraço. :)
Reply all
Reply to author
Forward
0 new messages