Sequelize: Использование Нескольких Баз Данных

нужно ли создавать несколько экземпляров 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 ответов


вам нужно создать различные экземпляры sequelize для каждого соединения БД, которое вы хотите создать:

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

каждый экземпляр, созданный из sequelize, имеет свою собственную информацию о БД (DB host, url, user, pass и т. д...), и эти значения не предназначены для изменения, поэтому нет "правильного" способа создания нескольких соединений с одним экземпляром sequelize.

из их документов:

Sequelize установит пул соединений при инициализации, поэтому вы должны в идеале всегда создавайте только один экземпляр для каждой базы данных.

один экземпляр на базе

"общий" подход для этого-наличие ваших баз данных в config.json файл и цикл над ним, чтобы создать соединения динамически, что-то вроде этого может быть:

конфигурации.в 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(asd).reduce((r, db) => (r[db[0]] = db[1].path) && r, {});

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

вы нужно будет сделать немного больше кодирования, чтобы запустить его, но это общая идея.


почему вы не используете raw-запрос? С помощью этого вы можете подключиться к одной базе данных и запросить другую. См. пример кода ниже.

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

Если вы пытаетесь связать объекты в одном 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