Nodejs преувеличивает объемный рост

Есть ли способ сделать массовую вставку в продолжение. Также я могу указать, какие ключи использовать для проверки дубликатов.

Я попробовал следующее, но не сработало:

Employee.bulkCreate(data, {
    updateOnDuplicate: true
});

Массовое создание работает хорошо, хотя. Выше оператор всегда создает новые записи в БД.

Ответ 1

Из официальной ссылки sequelizejs.

Это можно сделать с помощью bulkCreate с опцией updateOnDuplicate.

Вот так например:

Employee.bulkCreate(dataArray, 
    {
        fields:["id", "name", "address"] ,
        updateOnDuplicate: ["name"] 
    } )

updateOnDuplicate - это массив полей, которые будут обновляться, когда первичный ключ (или может быть уникальным ключом) соответствует строке. Убедитесь, что в вашей модели и в dataArray есть хотя бы одно уникальное поле (скажем, id) для upsert.

Ответ 2

Поскольку PostgreSQL не поддерживается ответом, альтернатива "" "" best "" "" с использованием Sequelize выполняет запрос вручную с помощью оператора ON CONFLICT. Пример (машинопись):

const values: Array<Array<number | string>> = [
    [1, 'Apple', 'Red', 'Yummy'],
    [2, 'Kiwi', 'Green', 'Yuck'],
]

const query = 'INSERT INTO fruits (id, name, color, flavor) VALUES ' +
     values.map(_ => { return '(?)' }).join(',') +
     ' ON CONFLICT (id) DO UPDATE SET flavor = excluded.flavor;'

sequelize.query({ query, values }, { type: sequelize.QueryTypes.INSERT })

Это создаст запрос вроде:

INSERT INTO 
    fruits (id, name, color, flavor)
VALUES 
    (1, 'Apple', 'Red', 'Yummy'),
    (2, 'Kiwi', 'Green', 'Yuck')
ON CONFLICT (id) DO UPDATE SET 
    flavor = excluded.flavor;

Достаточно сказать, что это не идеальное решение для ручного построения запросов, так как оно отрицает цель использования sequelize, но если это одноразовый запрос, который вам остро не нужен, вы можете использовать этот метод.

Ответ 3

Обновление 2019 года

Работает для всех диалектов при условии, что определенная минимальная версия соответствует

ЗДЕСЬ является ссылкой на исходный код для того же

  • Обратите внимание, что отдельные варианты могут работать или не работать на всех диалектах Например, updateOnDuplicate будет работать только на MySQL, MariaDB, SQLite и Postgres

  • Параметр ignoreDuplicates НЕ будет работать на MSSQL

Также проверьте этот блок кода в источнике

if (Array.isArray(options.updateOnDuplicate) && options.updateOnDuplicate.length) {
    options.updateOnDuplicate = _.intersection(
        _.without(Object.keys(model.tableAttributes), createdAtAttr),
        options.updateOnDuplicate
    );
} else {
    return Promise.reject(new Error('updateOnDuplicate option only supports non-empty array.'));
}

updateOnDuplicate должен быть массивом, не может быть истинным или ложным

Итак, следуя вышеприведенным пунктам, ваш код должен выглядеть примерно так:

Employee.bulkCreate(data, {
    updateOnDuplicate: ['employeeName', 'employeeAge'],
});

Ответ 4

Я не могу комментировать, поэтому добавляю ответ. Для Mysql, Mariadb вы можете использовать следующее:

Model.bulkCreate(dataArray, {updateOnDuplicate: []});

используя вышеупомянутое, он вставит, если он новый, или обновит все поля, если он дубликат. Не нужно объявлять поля, если вы хотите обновить все.

Примечание: это не работает для Sequelize 5, они недавно изменили это.

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