Подключение к нескольким базам данных MySQL в Feathers.js с помощью Sequelize - PullRequest
0 голосов
/ 20 февраля 2019

Мне не удалось найти документированный способ подключения к нескольким базам данных MySQL в Feathers.js с помощью Sequelize.Есть ли способ сделать это?Мой вариант использования - возможность вставлять и получать строки данных в несколько БД из одного действия, но БД не обязательно будет иметь одинаковую схему.

Спасибо!

1 Ответ

0 голосов
/ 15 марта 2019

Я сделал локальный тест, и это возможно.Вам нужно определить 2 разных клиента sequelize.Если вы используете генератор CLI и настраиваете службу на основе секвелирования, у вас должна быть строка подключения (мой пример - mysql db):

  • строка подключения дБ в конфигурации/default.json

    "mysql" : "mysql://user:password@localhost:3306/your_db"

  • a sequelize.js в корневой папке src

Для созданиявторой клиент sequelize

  1. создать новую строку подключения в config/default.json

    "mysql2" : "mysql://user:password@localhost:3306/your_db_2"

  2. создать копиюфайла sequelize.js и назовите его sequelize2.js

    const Sequelize = require ('sequelize');

    module.exports = function (app) {
      const connectionString = app.get('mysql2');
      const sequelize2 = new Sequelize(connectionString, {
        dialect: 'mysql',
        logging: false,
        operatorsAliases: false,
        define: {
          freezeTableName: true
        }
      });
      const oldSetup = app.setup;
    
      app.set('sequelizeClient2', sequelize2);
    
      app.setup = function (...args) {
        const result = oldSetup.apply(this, args);
    
        // Set up data relationships
        const models = sequelize2.models;
        Object.keys(models).forEach(name => {
          if ('associate' in models[name]) {
            models[name].associate(models);
          }
        });
    
        // Sync to the database
        sequelize2.sync();
    
        return result;
      };
    };
    

добавьте новую конфигурацию sequelize в ваше приложение.js

const sequelize2 = require('./sequelize2');
app.configure(sequelize2);

Затем в вашей модели с точностью до секунды дБ:

const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;

module.exports = function (app) {
  //load the second client you defined above
  const sequelizeClient = app.get('sequelizeClient2');
  //to check if connect to a different db
  console.log ( sequelizeClient )
  //your model
  const tbl = sequelizeClient.define('your_table', {

    text: {
      type: DataTypes.STRING,
      allowNull: false
    }
  }, {
    hooks: {
      beforeCount(options) {
        options.raw = true;
      }
    }
  });

  // eslint-disable-next-line no-unused-vars
  tbl.associate = function (models) {
    // Define associations here
    // See http://docs.sequelizejs.com/en/latest/docs/associations/
  };

  return tbl;
};

Для работы вам нужно 2 разных сервиса, каждый из которых работает с разным дб.Если вы хотите поставить или получить одно действие, вы можете создать до / после хук в одном из сервисов и вызвать внутри хука второй сервис.Для получения вам нужно добавить результат второго сервиса к вашему результату ловушки

...