Sequelize:使用多个数据库
Sequelize: Using Multiple Databases
如果我想使用两个数据库,是否需要创建多个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....
});
我尝试 "trick" 在模型定义中使用点符号
var InterestingStatistics = sequelize.define('stats.interesting_statistics', { /* ... */ });
但这会创建 table customers.stats.interesting_statistics
。我需要使用统计数据库中现有的 table。
实现这一目标的正确方法是什么?谢谢
您需要为要创建的每个数据库连接创建不同的 sequelize 实例:
const Sequelize = require('Sequelize');
const userDb = new Sequelize(/* ... */);
const contentDb = new Sequelize(/* ... */);
从 sequelize 创建的每个实例都有自己的数据库信息 (数据库主机、url、用户、密码等...),这些值不是意味着要改变,所以没有 "correct" 方法可以用一个 sequelize 实例创建多个连接。
Sequelize will setup a connection pool on initialization so you should
ideally only ever create one instance per database.
每个数据库一个实例
一种 "common" 方法可以做到这一点,将您的数据库放在 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
您需要做更多的编码才能启动它,运行但这是一个总体思路。
你为什么不使用原始查询?有了它,您可以连接到一个数据库并查询另一个。
请参阅下面的示例代码。
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
这会将数据库名称添加到 table 名称之前,因此,您的查询大概会像这样:
SELECT A.ColA, B.ColB FROM SchemaA.ATable A INNER JOIN SchemaB.BTable B ON B.BId = A.BId
如果我想使用两个数据库,是否需要创建多个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....
});
我尝试 "trick" 在模型定义中使用点符号
var InterestingStatistics = sequelize.define('stats.interesting_statistics', { /* ... */ });
但这会创建 table customers.stats.interesting_statistics
。我需要使用统计数据库中现有的 table。
实现这一目标的正确方法是什么?谢谢
您需要为要创建的每个数据库连接创建不同的 sequelize 实例:
const Sequelize = require('Sequelize');
const userDb = new Sequelize(/* ... */);
const contentDb = new Sequelize(/* ... */);
从 sequelize 创建的每个实例都有自己的数据库信息 (数据库主机、url、用户、密码等...),这些值不是意味着要改变,所以没有 "correct" 方法可以用一个 sequelize 实例创建多个连接。
Sequelize will setup a connection pool on initialization so you should ideally only ever create one instance per database.
每个数据库一个实例
一种 "common" 方法可以做到这一点,将您的数据库放在 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
您需要做更多的编码才能启动它,运行但这是一个总体思路。
你为什么不使用原始查询?有了它,您可以连接到一个数据库并查询另一个。 请参阅下面的示例代码。
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
这会将数据库名称添加到 table 名称之前,因此,您的查询大概会像这样:
SELECT A.ColA, B.ColB FROM SchemaA.ATable A INNER JOIN SchemaB.BTable B ON B.BId = A.BId