Sequelize, считывающий идентификатор вставленной строки сразу после ее вставки без фиксации транзакции

#javascript #mysql #transactions #sequelize.js

#javascript #mysql #транзакции #sequelize.js

Вопрос:

Идеальным решением для меня было бы вставить родительскую модель с некоторыми дочерними ассоциациями и создать каскадные дочерние ассоциации. Однако, поскольку я начинаю с Sequelize, и мне удалось заставить это работать, мне нужно вставить данные и настроить ассоциации вручную, чтобы все заработало.

В принципе, после вставки родительской строки мне нужно иметь возможность получить автоматически созданный идентификатор (последовательность, управляемая mysql, а не sequelize), чтобы назначить этот идентификатор в качестве внешнего ключа дочернему объекту. В идеале я хотел бы выполнить все атомарно внутри транзакции, поэтому, если что-то пойдет не так, мы откатим все. При этом, если я не зафиксирую транзакцию вручную после вставки, я не смогу получить идентификатор родительского объекта. Есть ли способ прочитать значение до совершения транзакции, какое-то грязное чтение?

пока это код:

 const ipiInterestedParty = {
            ip_base_nr: '118',
        };
    const transaction = await session.transaction();
    const instance = await IpiInterestedParty.create(ipiInterestedParty, {transaction});
    await transaction.commit();
        const createdWithId = await IpiInterestedParty.findOne({
            where: {ip_base_nr: '118'}
        });
  

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

Любая помощь, пожалуйста?

Ответ №1:

Обычно вы получаете instance значение первичного ключа после выполнения create метода модели, если вы указали в PK модели autoIncrement: true . Таким образом, у вас уже есть идентификатор parent записи для создания дочерних записей. Не забудьте передать объект транзакции всем методам, которые создают CRUD внутри транзакции.

Комментарии:

1. Да, я так и думал, однако по какой-то причине, если я устанавливаю значение autoIncrement равным true в PK модели вместо определения столбца mysql, я получаю сообщение об ошибке «Поле ‘id’ не имеет значения по умолчанию» для ID (очевидно, потому что я хочу, чтобы Sequelize увеличил его для меня !!). ВСТАВИТЬ В ipi_interested_party ( id , ip_base_nr ) ЗНАЧЕНИЯ (ПО УМОЛЧАНИЮ,?);

2. Эти autoIncrement: true параметры означают, что БД имеет настройку автоинкремента для столбца PK, поэтому не удаляйте определение автоинкремента в MySQL.

3. Теперь работает как шарм. Оказывается, что БД воссоздается с использованием скрипта liquibase, и мне не хватало установить startWith для определения столбца, чтобы автоинкремент работал. Теперь я правильно получаю идентификатор. Спасибо!!