我想知道如果我要插入的记录存在,是否有更好的方法先检查数据库以避免重复。这样我就可以插入唯一的记录。
现在我所做的是通过 if 语句使用原始查询来检查数据库,如果它通过了我插入记录的条件:
const addName = function(name, amount) {
sequelize.query(`SELECT * FROM names WHERE name="${name}"`, { type: sequelize.QueryTypes.SELECT})
.then(names => {
if (names.length === 0) {
sequelize.query(
`INSERT INTO names (name, amount) VALUES('${name}','${amount}')`, {
type: Sequelize.QueryTypes.INSERT
}
).then(function (data) {
console.log('inserted STEAMER data---> ', data);
});
} else {
console.log('Duplicate records >>>>>>');
}
});
};
是否有其他方法可以通过 Sequelize JS 执行此操作?
最佳答案
我认为您必须使用 Sequelize 的 ORM 方式,并且只需在模型上调用 findOrCreate
方法。
例子:
1) db.js
:
const Sequelize = require('sequelize');
const sequelize = new Sequelize('mysql://user:pass@127.0.0.1:3306/dbname');
const Name = sequelize.define('Name', {
name: {
type: Sequelize.STRING,
allowNull: false,
unique: true
},
amount: {
type: Sequelize.DECIMAL(10, 2), // or .INTEGER
allowNull: false,
defaultValue: 0
}
}, {
tableName: 'names',
timestamps: false,
freezeTableName: true
});
// extending model with method
Name.upsert = (name, amount) => {
const find = {name};
const create = {name, amount};
return Name.findOrCreate({where: find, defaults: create});
};
module.exports = {sequelize, models: {Name}};
2) app.js
(在 expressjs 示例中):
const db = require('./db');
const Name = db.models.Name;
app.post('/names', async (req, res) => {
try {
const name = req.body.name;
const amount = req.body.amount;
const result = await Name.upsert(name, amount);
res.status(200).send(result);
}
catch (error) {
res.status(500).send(error);
}
});
阅读this getting started并使用现成的 Sequelize ORM 方法节省您的时间
关于mysql - 使用 Sequelize JS 插入唯一记录的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50164854/