首页 > 解决方案 > 使用 Sequelize JS 插入唯一记录的更好方法

问题描述

我想知道如果我要插入的记录存在以避免重复,是否有更好的方法首先检查数据库。这样我就可以插入唯一的记录。

现在我所做的是通过 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 做到这一点?

标签: mysqlsequelize.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);
  }
});

阅读此入门并使用 Sequelize ORM 的现成方法节省您的一天


推荐阅读