Sequelize: соединить несколько баз данных с одной схемой - PullRequest
1 голос
/ 08 апреля 2020

Dears.

Моя бизнес-логика c очень сложна для объяснения, но в целом я могу описать это так: у меня есть центральная база данных, в которой я сохраняю глобальную конфигурацию, и прибл. 22 базы данных доставлены по моей стране с той же схемой. Следуя документации Sequelize, я создал такую ​​конфигурацию в приложении. 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;

Но я не знаю, как настроить модели, использующие меняющиеся соединения. Если я создаю dbSala для каждой имеющейся у меня sala (dbSala1, dbSala2 ... et c), мне нужно повторить каждый файл модели, и это невозможно управлять.

Я думал, что ответ был здесь: Sequelize: использование нескольких баз данных , но в моем случае это не сработало.

Я использую sequelize 4.43.0

Пожалуйста, скажите, если вам нужно что-то объяснить лучше

спасибо!

1 Ответ

0 голосов
/ 08 апреля 2020

Вы должны зарегистрировать все определения модели в каждом созданном экземпляре секвелирования (т. Е. Для каждого соединения). Определите ваши модели как функции, которые имеют экземпляр 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
}

И затем используйте эти функции для регистрации моделей в каждом экземпляре сиквелиза.

...