web-dev-qa-db-ja.com

続編:複数のデータベースの使用

2つのデータベースを使用する場合、Sequelizeの複数のインスタンスを作成する必要がありますか?つまり、同じマシン上の2つのデータベース。

そうでない場合、これを行う適切な方法は何ですか?私には、2つのデータベースを使用するために2回接続しなければならないのはやり過ぎのようです。

たとえば、機能ごとに異なるデータベースがあります。たとえば、あるデータベースに顧客データがあり、別のデータベースに統計データがあるとします。

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を作成します。統計データベースの既存のテーブルを使用する必要があります。

これを達成する適切な方法は何ですか?ありがとう。

14
dougBTV

作成するDB接続ごとに、sequelizeの異なるインスタンスを作成する必要があります。

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

Sequelizeから作成された各インスタンスには、独自のDB情報(db Host、url、user、passなど)があり、これらの値は変更するためのものではないため、 sequelizeの1つのインスタンスで複数の接続を作成する「正しい」方法ではありません。

彼らのドキュメントから

Sequelizeは初期化時に接続プールをセットアップするため、理想的にはデータベースごとに1つのインスタンスのみを作成する必要があります。

データベースごとに1つのインスタンス

これを行うための「一般的な」アプローチは、データベースを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

起動して実行するにはもう少しコーディングする必要がありますが、それは一般的な考え方です。

27
Aramil Rey

生のクエリを使用しないのはなぜですか?これにより、1つのデータベースに接続し、他のデータベースを照会できます。以下のサンプルコードを参照してください。

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
Y Talansky

同じ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

0
john ellis