Sequelize:使用相同架构连接多个数据库

问题描述 投票:0回答:3

亲爱的。

我的业务逻辑解释起来非常复杂,但总的来说我可以这样描述:我有一个中央数据库,我在其中保存全局配置,并且有大约。在我的国家/地区提供了 22 个具有相同架构的数据库。按照 Sequelize 文档,我在 app.js 中创建了这样的配置:

global.dbCentral = new Sequelize('mysql://dir:password@localhost:port/dbCentral', {
  dialect: 'mysql',
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  },
  operatorsAliases: false
  , timezone: '-03:00' //for writing to database
});
global.dbSala = new Sequelize('mysql://dir:password@localhost:port/defaultDb', {
  dialect: 'mysql',
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  },
  operatorsAliases: false
  , timezone: '-03:00' //for writing to database
});

有了中央连接,我就没有问题了。即我创建了一个这样的模型:

const Sequelize = require('sequelize');

const Promocion = dbCentral.define('promocion', {
    id: {
        type: Sequelize.INTEGER(10).UNSIGNED,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true
    },
    titulo: {
        type: Sequelize.TEXT,
        allowNull: true
    },
    descripcion: {
        type: Sequelize.TEXT,
        allowNull: true
    },
    monto: {
        type: Sequelize.FLOAT,
        allowNull: true
    },
    img: {
        type: Sequelize.STRING(45),
        allowNull: true
    },
    activa: {
        type: Sequelize.BOOLEAN,
        allowNull: true
    },
    fecha_inicio: {
        type: Sequelize.DATE,
        allowNull: true
    },
    fecha_fin: {
        type: Sequelize.DATE,
        allowNull: true
    }
}, {
        tableName: 'promocion',
        timestamps: false
    });


Promocion.hasMany(PromocionUsuarioCruciclub, { as: 'promocion_usuario_cruciclub', foreignKey: 'id', targetKey: 'id_promocion' });

module.exports = Promocion;

但我不知道如何设置使用变化连接的模型。如果我为每个 sala 创建一个 dbSala(dbSala1、dbSala2...等),我需要重复每个模型文件,这是不可能管理的。

我认为答案就在这里:Sequelize:使用多个数据库但它对我的案例不起作用。

我正在使用sequelize 4.43.0

请告诉我您是否需要更好地解释一些事情

谢谢!

javascript node.js database sequelize.js
3个回答
2
投票

我使用交易取得了成功。我有一个主数据库,我为其创建了模型。然后,为了使用相同的模型,但对于具有相同结构的其他数据库,我简单地基于连接到另一个数据库的不同 Sequelize 实例创建了一个事务,并将该事务作为选项参数的一部分传递给模型方法。


1
投票

您应该在每个创建的sequelize实例中注册所有模型定义(即对于每个连接)。将模型定义为以sequelize 实例作为参数并返回已注册模型定义的函数。 像这样的东西:

module.exports = (sequelize, DataTypes) => {
  const action = sequelize.define('action', {
    id: {
      type: DataTypes.UUID,
      allowNull: false,
      primaryKey: true
    },
// <here some other fields>
  },
    {
      schema: 'public',
      tableName: 'action'
    })

  action.associate = (models) => {
    action.belongsTo(models.resource, { foreignKey: 'resourceId' })
  }

  return action
}

然后使用这些函数在每个sequelize实例中注册模型。


0
投票

终于用交易解决了

  const rowsbackup = await backupModel.findAll({
                where: condition,
                raw: true,
               
            });

console.log('backupmodel ...', backupModel);
                const backup = rowsbackup.map(Data => ({ ...Data }));
                transaction = await anotherDBDetails.transaction();
                const createdBackup = await backupModel.bulkCreate(backup, { transaction });
                await transaction.commit();
© www.soinside.com 2019 - 2024. All rights reserved.