亲爱的。
我的业务逻辑解释起来非常复杂,但总的来说我可以这样描述:我有一个中央数据库,我在其中保存全局配置,并且有大约。在我的国家/地区提供了 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
请告诉我您是否需要更好地解释一些事情
谢谢!
我使用交易取得了成功。我有一个主数据库,我为其创建了模型。然后,为了使用相同的模型,但对于具有相同结构的其他数据库,我简单地基于连接到另一个数据库的不同 Sequelize 实例创建了一个事务,并将该事务作为选项参数的一部分传递给模型方法。
您应该在每个创建的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实例中注册模型。
终于用交易解决了
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();