updateOnDuplicate не влияет - PullRequest
       6

updateOnDuplicate не влияет

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

привет, я хочу вставить данные с bulkCreate, например:

[ { "typeId": 5, "devEui": "0094E796CBFCFEF9", "application_name": "Pressure No.10", "createdAt": "2020-02-05T08:07:17.000Z", "updatedAt": "2020-02-05T08:07:17.000Z" } ]

и моим кодом продолжения:

 return models.sequelize.transaction(t=>{
            return models.iot_nodes.bulkCreate(data,{
                updateOnDuplicate: ["devEui",]
            })
        })

, когда я нажимаю этот код в первых данных, которые Когда я снова нажму те же данные, которые не обновляются, будет вставлено в БД 1014 *

1 Ответ

0 голосов
/ 11 марта 2020

Кажется, что подходит этот сценарий, основанный на информации. Вы хотите обновить devEui поле. updateOnDuplicate параметр:

Поля для обновления, если ключ строки уже существует (при обновлении дублированного ключа)?

Таким образом, row key already exists означает, что таблица должна иметь уникальный ключ или первичный ключ дублируется при вставке данных.

Например

import { sequelize } from '../../db';
import { Model, DataTypes } from 'sequelize';

class IotNode extends Model {}
IotNode.init(
  {
    typeId: {
      type: DataTypes.INTEGER,
      unique: true,
    },
    devEui: DataTypes.STRING,
    application_name: DataTypes.STRING,
  },
  { sequelize, modelName: 'iot_nodes' },
);

(async function test() {
  try {
    await sequelize.sync({ force: true });
    const datas = [
      {
        typeId: 5,
        devEui: '0094E796CBFCFEF9',
        application_name: 'Pressure No.10',
        createdAt: '2020-02-05T08:07:17.000Z',
        updatedAt: '2020-02-05T08:07:17.000Z',
      },
    ];
    await IotNode.bulkCreate(datas, { updateOnDuplicate: ['devEui'] });
    await IotNode.bulkCreate(datas, { updateOnDuplicate: ['devEui'] });
  } catch (error) {
    console.log(error);
  } finally {
    await sequelize.close();
  }
})();

Как видите, я делаю typeId уникальным и дважды выполняю IotNode.bulkCreate. Сгенерированные SQL logs:

Executing (default): INSERT INTO "iot_nodes" ("id","typeId","devEui","application_name") VALUES (DEFAULT,5,'0094E796CBFCFEF9','Pressure No.10') ON CONFLICT ("typeId") DO UPDATE SET "devEui"=EXCLUDED."devEui" RETURNING *;
Executing (default): INSERT INTO "iot_nodes" ("id","typeId","devEui","application_name") VALUES (DEFAULT,5,'0094E796CBFCFEF9','Pressure No.10') ON CONFLICT ("typeId") DO UPDATE SET "devEui"=EXCLUDED."devEui" RETURNING *;

sequelize используют уникальное поле typeId в качестве дублирующего ключа. Проверьте строки в базе данных:

=# select * from iot_nodes;
 id | typeId |      devEui      | application_name
----+--------+------------------+------------------
  1 |      5 | 0094E796CBFCFEF9 | Pressure No.10
(1 row)

Строка данных будет перенесена, как и ожидалось.

Если мы удалим unique: true из поля typeId. sequelize будет использовать первичный ключ в качестве дублирующего ключа. Посмотрите ниже сгенерированные SQL и строки данных в базе данных:

Executing (default): INSERT INTO "iot_nodes" ("id","typeId","devEui","application_name") VALUES (DEFAULT,5,'0094E796CBFCFEF9','Pressure No.10') ON CONFLICT ("id") DO UPDATE SET "devEui"=EXCLUDED."devEui" RETURNING *;
Executing (default): INSERT INTO "iot_nodes" ("id","typeId","devEui","application_name") VALUES (DEFAULT,5,'0094E796CBFCFEF9','Pressure No.10') ON CONFLICT ("id") DO UPDATE SET "devEui"=EXCLUDED."devEui" RETURNING *;
=# select * from iot_nodes;
 id | typeId |      devEui      | application_name
----+--------+------------------+------------------
  1 |      5 | 0094E796CBFCFEF9 | Pressure No.10
  2 |      5 | 0094E796CBFCFEF9 | Pressure No.10
(2 rows)
...