2016-05-06 43 views
3

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

そうでない場合、これを行うにはどうすればよいですか? 2つのデータベースを使用するために2回接続する必要があるのは残念です。

たとえば、私は異なるデータベースにデータベースを用意しています。たとえば、顧客データがあるデータベースにあり、統計データが別のデータベースにあるとします。

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.... 

}); 

sequelizeと接続するためにこれを持っては「トリック」モデルの定義では、それによっては、ドット表記を使用する

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

しかし、テーブルcustomers.stats.interesting_statisticsが作成されます。私は、統計データベースの既存のテーブルを使用する必要があります。

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

答えて

9

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

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

sequelizeから作成された各インスタンスは、独自のDB情報(DBホスト、URL、ユーザー、パス、何でも)を持っています後継の1つのインスタンスで複数の接続を作成する方法はありません。

From their docs

Sequelizeはあなたが 理想的にしかデータベースごとに1つのインスタンスを設定初期化の接続プールを作成する必要がありますので。データベースあたり

つのインスタンス

これを行うには、「一般的な」アプローチ、多分、dinamicallyこのような何かを接続を作成するためにそれ以上のconfig.jsonファイルやループ内のデータベースを持っています:

config.json

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

アプリ

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

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

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

あなたはもう少しそれを得るために、符号化および実行されているが、その一般的なアイデアを行う必要があります。

+2

優秀な回答、ありがとうございます。確認されて、完璧に動作します。私は先に進んで複数のインスタンスを作成した後、モデルを作成するときにこれらのインスタンスを参照し、魅力的な作品となります。健全性チェックを評価して、私がハックアイシェフでやっていないことを確認してください。 – dougBTV

+0

私は、複数のデータベースへのアクセスで同様の問題を抱えています。 私のアプリケーションには、同じスキーマを持つ複数のデータベースへのすべてのdb接続を処理する1つのdb接続プールがあります。だから、私はまだ完全な解決策を見つけていない。 – huangchang

+0

@dougBTVスニペットを共有して、それらの間の関係を表現できますか? –

1

なぜ生のクエリを使用しないのですか?これにより、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); 
    }) 
} 
0

i have same issue but table structure same and different databases. ので、私はsequelizeオブジェクト

sequelize .config.database= 'databaseName'; sequelize .connectionManager.config.database= 'databaseName';

の変化の下に行う必要がありますが、私は最初の時間があるときには、古いデータベースと二時間、それは適切な結果を与えているに接続します。

だから誰でもこの現象が発生するのは知っていますか?

関連する問題