Sequelize: Using Multiple Databases

匿名 (未验证) 提交于 2019-12-03 02:00:02

问题:

Do I need to create multiple instances of Sequelize if I want to use two databases? That is, two databases on the same machine.

If not, what's the proper way to do this? It seems like overkill to have to connect twice to use two databases, to me.

So for example, I have different databases for different functions, for example, let's say I have customer data in one database, and statistical data in another.

So in MySQL:

MySQL [customers]> show databases; +--------------------+ | Database           | +--------------------+ | customers          | | stats              | +--------------------+

And I have this to connect with sequelize

// Create a connection.... var Sequelize = require('sequelize'); var sequelize = new Sequelize('customers', 'my_user', 'some_password', {     host: 'localhost',     dialect: 'mysql',      pool: {         max: 5,         min: 0,         idle: 10000     },     logging: function(output) {         if (opts.log_queries) {             log.it("sequelize_log",{log: output});         }     }  });  // Authenticate it. sequelize.authenticate().nodeify(function(err) {      // Do stuff....  });

I tried to "trick" it by in a definition of a model using dot notation

var InterestingStatistics = sequelize.define('stats.interesting_statistics', { /* ... */ });

But that creates the table customers.stats.interesting_statistics. I need to use an existing table in the stats database.

What's the proper way to achieve this? Thanks.

回答1:

You need to create different instances of sequelize for each DB connection you want to create:

const Sequelize = require('Sequelize'); const userDb = new Sequelize(/* ... */); const contentDb = new Sequelize(/* ... */);

Each instance created from sequelize has its own DB info (db host, url, user, pass, whatever) so there is no way to create multiple connections with one instance of sequelize.

From their docs:

Sequelize will setup a connection pool on initialization so you should ideally only ever create one instance per database.

One instance per database

A "common" approach to do this, is having your databases in a config.json file and loop over it to create connections dinamically, something like this maybe:

config.json

{     /*...*/     databases: {         user: {             path: 'xxxxxxxx'         },         content: {             path: 'xxxxxxxx'         }     } }

Your app

const Sequelize = require('sequelize'); const config = require('./config.json');  const db = {}; const databases = Object.keys(config.databases); for(let i = 0; i < databases.length; ++i) {     let database = databases[i];     let dbPath = config.databases[database];     db[database] = new Sequelize( dbPath ); }  // Sequelize instances: // db.user // db.content

You will need to do a little bit more coding to get it up and running but its a general idea.



回答2:

Why don't you use raw query? With this you can connect to one database and query the other. See sample code below.

const sequelize = require('db_config'); function test(req, res){   const qry = `SELECT * FROM db1.affiliates_order co LEFT JOIN db2.affiliates m ON m.id = co.campaign_id`;   sequelize.query(qry, null, {  raw: true}).then(result=>{     console        
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!