【问题标题】:Sequelize: Using Multiple DatabasesSequelize:使用多个数据库
【发布时间】:2016-05-06 18:18:03
【问题描述】:

如果我想使用两个数据库,是否需要创建多个 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。我需要使用 stats 数据库中的现有表。

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

【问题讨论】:

    标签: javascript mysql node.js sequelize.js


    【解决方案1】:

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

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

    从 sequelize 创建的每个实例都有自己的 DB 信息(db host, url, user, pass, etc...),这些值并不是要改变的,所以没有使用一个 sequelize 实例创建多个连接的“正确”方法。

    From their docs:

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

    每个数据库一个实例

    执行此操作的“常见”方法是将您的数据库放在 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
    

    您需要进行更多编码才能启动并运行它,但这是一个大体思路。

    【讨论】:

    • 很好的答案,谢谢。确认,完美运行。我已经创建了多个实例,然后在创建模型时引用了这些实例,它很有魅力。感谢完整性检查,以确保我没有以 hack-ish 的方式进行检查。
    • 我在访问多个数据库时遇到了类似的问题。在我的应用程序中,有一个数据库连接池,它处理所有数据库连接到具有相同架构的多个数据库。所以,我还没有找到完美的解决方案。
    • @dougBTV 你能分享一下sn-p来代表他们之间的关系吗?
    • 这是可扩展的吗?如果我有超过 100 个数据库要处理,这会导致任何问题吗? 1000? 10 000 ?
    • @NicolasB。好吧,an array can store up to 2^32 elements,所以我们可以假设您在可扩展性方面永远不会遇到问题
    【解决方案2】:

    如果您尝试跨多个数据库关联同一 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

    【讨论】:

    • 这很有趣,因为 PG 使用的模式与 MSSQL 略有不同。我目前正在研究多数据库 MSSQL,我想我会看看是否可以将模式点表示法应用于数据库。
    • 是的。只要为每个数据库加载模型,我就可以使用点符号进入不同的数据库和模式
    【解决方案3】:

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

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

    【讨论】:

    • 我们可以在 Postgres 中通过查询从两个数据库中获取数据吗?
    • OP 询问查询不同的数据库而不是不同的表!
    • @alfasin 这个答案包括 dbs,语法是 DB.Table,其中 DB 是您的数据库名称。
    • db 没有这样的语法:这是schema.table 而不是db.table
    猜你喜欢
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2021-03-15
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多