Sequelize Multi Вставка данных - PullRequest
       5

Sequelize Multi Вставка данных

0 голосов
/ 14 января 2020

Привет всем =) Я впервые использую sequelize с postgresql, и у меня проблема с множественной вставкой данных с помощью sequelize (node.js). У нас есть несколько таблиц (см. В pi c)

Табличные отношения

1) Клиенты -> 1: M -> Контракты

2 ) Контракты -> 1: M -> Contracts_attaches

3) Тарифы -> 1: M -> Contracts_attaches

Test Tables

Модель клиента

const Client = db.define('clients', {
   id_clients: {
      type: Sequelize.INTEGER,
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
   },
   nclients: {
      type: Sequelize.STRING
   }
 -some fields-
   createdAt: {
      allowNull: false,
      type: Sequelize.DATE
   },
   updatedAt: {
      allowNull: false,
      type: Sequelize.DATE
   }
});

Модель тарифа

    const Rate = db.define('rates', {
       id_rates: {
          type: Sequelize.INTEGER,
          allowNull: false,
          autoIncrement: true,
          primaryKey: true
       }
        --fields--
       createdAt: {
          allowNull: false,
          type: Sequelize.DATE
       },
       updatedAt: {
          allowNull: false,
          type: Sequelize.DATE
       }
    })

Модель контракта

    const Contract = db.define('contracts', {
       id_contracts: {
          type: Sequelize.INTEGER,
          allowNull: false,
          autoIncrement: true,
          primaryKey: true
       },
       --fields--
       id_clients: {
          type: Sequelize.INTEGER,
          allowNull: false
       },
       createdAt: {
          allowNull: false,
          type: Sequelize.DATE
       },
       updatedAt: {
          allowNull: false,
          type: Sequelize.DATE
       }
    })

Contract_attach Модель

const Contract_attach = db.define('contract_attach', {
   id: {
      type: Sequelize.INTEGER,
      allowNull: false,
      autoIncrement: true,
      primaryKey: true
   },
   contracts_id: {
      type: Sequelize.INTEGER,
      references:{
         model:'contracts',
         key:'id_contracts'
      }
   },
   rate_id: {
      type: Sequelize.INTEGER

   },
   createdAt: {
      allowNull: false,
      type: Sequelize.DATE
   },
   updatedAt: {
      allowNull: false,
      type: Sequelize.DATE
   },
})

Конфигурация ассоциации

Contract.belongsTo(Contract_attach, { foreignKey:'id_contracts', sourceKey:'contracts_id' });
Contract_attach.hasMany(Contract,{foreignKey:'id_contracts', sourceKey:'contracts_id'});
Contract_attach.hasMany(Rate,{foreignKey: 'id_rates', sourceKey: 'rate_id'});
Rate.belongsTo(Contract_attach, { foreignKey: 'rate_id', sourceKey: 'id_rates' });

Пример вставки данных

Я пытаюсь вставить данные, как этот код

Contract.create({'numcontract':22,'datereg':'2019-12-11','id_clients':5,Contract_attach:[{'rate_id':2,'rate_id':3}]},
            {include: [Contract_attach]}).then(result => console.log(result));

или этот код

Contract.create({'numcontract':22,'datereg':'2019-12-11','id_clients':5,Contract_attach:[{'ratename':'Small Buissness','ratename':'Small Buissness 10'}]},
            {include: [Contract_attach]}).then(result => console.log(result));

Когда я пытаюсь вставить данные с этим кодом, добавьте данные вставки по очереди только для таблицы Contract и без учета вставки в Contract_attach .

PS. Rate таблица содержит данные, и нам не нужно вставлять данные в таблицу Rate .

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Здесь есть несколько проблем

  1. Вы сказали, что Контракт> 1: M> Contract_attach, тогда вы пишете Contract_attach.hasMany (Contract ... et c. Это должно быть наоборот .hasMany (Contract_attach ... et c то же самое относится к ставкам
  2. На диаграмме есть связь между Contract_attach и ставками, но определение, которое вы не определили этой ссылкой
  3. Не ясно, что Столбцы rate_id и contract_id обнуляются или нет. На основании этого мы можем определить, может ли Contract_attach принадлежать или не принадлежать двум разным таблицам.

Я думаю, что схему базы данных нужно изменить или объяснить, почему ее таким образом

0 голосов
/ 14 января 2020

Для некоторых это может быть и будет полезно, но я решил эту проблему следующим образом

Contr.create({'numcontract':22,'datereg':'2019-12-11','id_clients':5})
     .then(function(contr){   
                contract_att.bulkCreate([{'contracts_id':contr.id_contracts, 'rate_id':2},{'contracts_id':contr.id_contracts,'rate_id':3}]);  
            });

Если у вас есть другое решение, пожалуйста, поделитесь))

...