首页 文章

Sequelize:使用多个数据库

提问于
浏览
10

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

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

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

所以在MySQL:

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

我有这个连接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....

});

我试图通过使用点符号的模型定义来“欺骗”它

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

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

实现这个目标的正确方法是什么?谢谢 .

3 回答

  • 3

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

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

    从sequelize创建的每个实例都有自己的数据库信息(db host,url,user,pass等等),并且这些值不应该被更改,因此没有"correct"方法来创建与一个实例的多个连接sequelize .

    From their docs

    Sequelize将在初始化时设置连接池,因此理想情况下,您应该只为每个数据库创建一个实例 .

    One instance per database

    执行此操作的方法是将数据库放在 config.json 文件中并在其上循环以创建连接,这可能是这样的:

    config.json

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

    Your app

    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(asd).reduce((r, db) => (r[db[0]] = db[1].path) && r, {});
    
    // Sequelize instances:
    // db.user
    // db.content
    

    您需要进行更多编码才能启动并运行,但这是一个大致的想法 .

  • 19

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

    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);
      })
    }
    
  • 1

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

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

    这会将db名称添加到表名称中,因此,大概会出现如下问题: SELECT A.ColA, B.ColB FROM SchemaA.ATable A INNER JOIN SchemaB.BTable B ON B.BId = A.BId

相关问题