我尝试在 CSV 导入中使用 findOrCreate
函数来防止使用同一电子邮件地址创建多个用户,但它不起作用。
我将 CSV 文件中的所有行导入到内存中:
importableCsvRows.forEach(row => importData(row))
然后我迭代每一行以导入用户:
function importData (row) {
const name = row[0]
const email = row[1]
addUser(name, email)
}
在 addUser 函数中我使用 findOrCreate:
function addUser (name, email) {
return new Promise(function (resolve, reject) {
const user = models.users.findOrCreate({
where: {email: email},
defaults: { email: email, name: name }
})
.then(u => {
return resolve(u)
})
.catch(err => {
console.log('ERROR', err)
return reject(err)
})
})
}
问题是多个事务开始,因为 findOrCreate 是异步的,所以在第一行完成处理之前,下一行开始。
最佳答案
在 forEach
中,您需要等到数据库事务完成才能开始导入下一个用户。
最简单的方法是 await importData
函数:
async function importData (row) {
const name = row[0]
const email = row[1]
try {
await addUser(name, email)
} catch(err) {
//console.log?
}
}
此外,在addUser
中:不需要返回自己的Promise。只需返回 promise findOrCreate
返回:
function addUser (name, email) {
return models.users.findOrCreate({
where: {email: email},
defaults: { email: email, name: name }
})
})
}
关于javascript - 如何在批量导入中使用sequelize findorcreate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50942594/