簡體   English   中英

Sequelize:使用相同的模式連接多個數據庫

[英]Sequelize: Connect multiple databases with the same schema

親愛的。

我的業務邏輯解釋起來非常復雜,但總的來說我可以這樣描述:我有一個中央數據庫,我在其中保存全局配置,並且有大約。 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
});

有了中央連接,我沒問題。 即我創建了一個 model 這樣的:

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...等),我需要重復每個 model 文件,這是不可能管理的。

我認為答案就在這里: Sequelize: Using Multiple Databases但它對我的情況不起作用。

我正在使用 sequelize 4.43.0

請告訴我你是否需要更好地解釋

謝謝!

您應該在每個創建的 sequelize 實例(即每個連接)中注冊所有 model 定義。 將您的模型定義為具有 sequelize 實例作為參數並返回已注冊的 model 定義的函數。 像這樣的東西:

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 實例中注冊模型。

我成功地使用了交易。 我有一個主數據庫,我為其創建了模型。 然后,為了使用相同的模型,但對於具有相同結構的其他數據庫,我簡單地創建了一個基於連接到另一個數據庫的不同 Sequelize 實例的事務,並將該事務作為選項參數的一部分傳遞給模型方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM