Sequelize:使用多个数据库

时间:2016-05-06 18:18:04

标签: javascript mysql node.js sequelize.js

如果我想使用两个数据库,是否需要创建Sequelize的多个实例?也就是说,同一台机器上有两个数据库。

如果没有,那么正确的方法是什么?对我来说,连接两次以使用两个数据库似乎有些过分。

例如,我有不同的数据库用于不同的功能,例如,假设我在一个数据库中有客户数据,在另一个数据库中有统计数据。

所以在MySQL:

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

我有这个与续集

连接
// 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....

});

我试图"欺骗"它使用点符号定义模型

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

但是这会创建表customers.stats.interesting_statistics。我需要使用统计数据库中的现有表。

实现这一目标的正确方法是什么?感谢。

3 个答案:

答案 0 :(得分:22)

您需要为要创建的每个数据库连接创建不同的sequelize实例:

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

从sequelize创建的每个实例都有自己的数据库信息(db host,url,user,pass等等),并且这些值不应该被更改,所以没有"正确"用一个sequelize实例创建多个连接的方法。

From their docs

  

Sequelize会在初始化时设置连接池,所以你应该这样做   理想情况下,每个数据库只创建一个实例。

每个数据库一个实例

A"常见"这样做的方法是将您的数据库放在config.json文件中并循环遍历它以创建连接,这可能是这样的:

<强> config.json

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

您的应用

const Sequelize = require('sequelize');
const config = require('./config.json');

// Loop through
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 );
}

// Or a one liner
const db = Object.entries(config).reduce((r, db) => (r[db[0]] = db[1].path) && r, {});

// Sequelize instances:
// db.user
// db.content

你需要做更多的编码来启动和运行它,但它是一个普遍的想法。

答案 1 :(得分:2)

为什么不使用原始查询?有了这个,您可以连接到一个数据库并查询另一个。 请参阅下面的示例代码。

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.log(result);
  })
}

答案 2 :(得分:1)

如果您试图跨多个数据库关联同一RDS中的对象,则可以使用schema

http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-schema

这会将数据库名称放在表名称的前面,因此,大概您的查询将如下所示: SELECT A.ColA, B.ColB FROM SchemaA.ATable A INNER JOIN SchemaB.BTable B ON B.BId = A.BId