mysql 序列化:使用多个数据库

qybjjes1  于 2022-12-10  发布在  Mysql
关注(0)|答案(4)|浏览(121)

如果我想使用两个数据库,我需要创建多个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。我需要使用STATS数据库中的现有表。
实现这一目标的正确方法是什么?谢谢。

quhf5bfb

quhf5bfb1#

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

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

从Sequelize创建的每个示例都有自己的DB INFO*(db host、url、user、pass等)*,这些值是不能更改的,所以没有使用Sequelize的一个示例创建多个连接的“正确”方法。
From their docs
注意,在上面的例子中,Sequelize指的是库本身,而Sequelize指的是Sequelize的示例,表示连接到一个数据库。这是推荐的约定,在整个文档中都将遵循它。
要做到这一点,一种“常见的”方法是将数据库放在config.json文件中,然后循环遍历该文件以动态地创建连接,如下所示:

config.json

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

您的APP

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

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

您将需要做一些更多的编码来启动和运行它,但这只是一个一般的想法。

cqoc49vn

cqoc49vn2#

为什么不使用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);
  })
}
bksxznpy

bksxznpy3#

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

0h4hbjxa

0h4hbjxa4#

除了选择的答案,因为我希望能够在多个数据库上运行迁移,这是我如何做到这一点,尽管它的设置相当费力,而且可能有一个更简单的方法(我希望),一旦设置它很容易添加迁移:
安装Sequelize-cli npm i sequelize-cli
1.创建一个迁移目录,为每个数据库命名一个子目录(例如/server/migrations/accounting/server/migrations/users)
1.为根目录下的每个数据库创建一个.sequelize-mydb文件(如.sequelize-accounting.sequelize-users等),并在每个文件中添加路径和数据库的相关信息:

const path = require("path");

module.exports = {
   config: path.resolve("config", "config.json"),
   "models-path": path.resolve("models"),
   "migrations-path": path.resolve("migrations", "accounting"),
};

1.在Sequelize config.json中,将每个数据库配置的副本添加到顶层部分,即。在开发/生产部门之外,例如:

{
     "development": {
         "baseUrl": "https://example.com/api/v2/",
         "databases": {
         "accounting": {
             "username": "root",
             "password": "",
             "database": "accounting_development",
             "host": "localhost",
             "dialect": "mysql",
             "dialectOptions": {
             "decimalNumbers": true
             },
         "users": {} etc
         }
     },

     // Copy the above config for each db to the top level ---->>

     "accounting": {
         "username": "root",
         "password": "",
         "database": "accounting_development",
         "host": "localhost",
         "dialect": "mysql",
         "dialectOptions": {
         "decimalNumbers": true
         }
     },
     "users": {}
 }

1.创建或添加到package.json的脚本部分:

"scripts": {
   "sequelize:accounting:migrate": "sequelize --options-path ./.sequelize-accounting --env accounting db:migrate",
   "sequelize:users:migrate": "sequelize --options-path ./.sequelize-users --env users db:migrate",
 }

1.现在,每当您创建迁移时,请将自动生成的迁移文件复制到上面创建的相对迁移目录中,例如为记帐数据库中的表创建迁移,然后将该文件复制到Migrations/count目录。
1.最后,要运行迁移:

npm run sequelize:accounting:migrate
 npm run sequelize:users:migrate

最棘手的部分是获得正确的相对路径(特别是在为Docker构建的情况下)。一旦准备就绪,每次创建新迁移时唯一额外的工作就是将该文件复制到适当的目录。

相关问题