#node.js #sqlite #promise #sequelize.js
Вопрос:
У меня есть база данных, содержащая books
отношения и writers
в M:N с использованием authors
таблицы ассоциаций. Я пытаюсь сохранить несколько books
, имеющих 0..n writers
каждый. Я запускаю модули узлов sequelize 6.6.2, sqlite 5 (в режиме разработки) и pg 8.5.1 (в режиме prod), npm
6.15.8, node
v14.16.0. Я не использую cls
режим, и я не определяю транзакции вручную.
Текущая часть кода выглядит так и работает так, как ожидалось
books.forEach(book => {
//create each book
db.models.Book.create({
name: book.name,
edition: book.edition
}).then(savedBook => {
//if book has authors, create the ones, that dont exist
if (book.authors) {
Promise.all(book.authors
.map(author => db.models.Writer.create(author))
).then(savedWriters => {
log.debug('savedWriters', savedWriters)
Promise.all(
// and create relation to book for each of them
savedWriters.map(writer => writer.dataValues)
.map(writer => db.models.Author.create({
bookId: savedBook.id,
writerId: writer.id
}))
).then(() => {
log.debug('authors saved')
callback()
}).catch(function (err) {
log.error('Error while saving authors ', err)
})
}).catch(function (err) {
log.error('Error while saving writers ', err)
})
} else {
callback()
}
})
но когда я меняю значение db.models.Writer.create
на db.models.Writer.findOrCreate
, я получаю исключения для транзакций
[SequelizeDatabaseError]: SQLITE_ERROR: cannot start a transaction within a transaction
Для завершений исключение не возникает ни при сохранении нескольких книг без авторов, ни при сохранении одной книги с несколькими авторами.
Как я мог бы достичь состояния, когда я не создавал writer
бы каждый раз, когда создается книга, если writer
она уже существует? Почему create
поведение отличается от findOrCreate
? Заранее спасибо.