#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 для определения столбца, чтобы автоинкремент работал. Теперь я правильно получаю идентификатор. Спасибо!!