在Express中使用Sequelize原生查询插入数据后如何返回展示插入内容
解决Sequelize原生插入后返回新增数据的方案
核心改动点
- 替换直接拼接SQL的写法,改用Sequelize参数化查询能力,避免SQL注入风险
- 插入语句末尾添加
RETURNING *子句(PostgreSQL原生支持),指定返回插入完成的行数据 - 为
sequelize.query方法添加配置参数,明确查询类型和返回规则
PostgreSQL环境下的完整实现代码
const c_product_post = async (req, res) => { try { // 参数化查询占位符用?对应传入的参数 const sql = `INSERT INTO products (p_name, p_price, p_stock, p_review, "createdAt", "updatedAt") VALUES (?, ?, ?, ?, now(), now()) RETURNING *;` // 传入参数数组,同时添加查询配置 const [insertedData] = await Product.sequelize.query(sql, { replacements: [ req.body.product_name, req.body.product_price, req.body.product_stock, req.body.product_review ], type: Product.sequelize.QueryTypes.INSERT }) res.send({ message: "success add new product", data: insertedData[0] // 取返回结果的第一个元素即为新增的完整数据 }) } catch (err) { res.send({ message: err.message }) } }
MySQL环境适配方案
MySQL不支持RETURNING语法,需要插入完成后通过返回的自增ID二次查询获取完整数据:
const c_product_post = async (req, res) => { try { const sql = `INSERT INTO products (p_name, p_price, p_stock, p_review, createdAt, updatedAt) VALUES (?, ?, ?, ?, now(), now());` const [insertResult] = await Product.sequelize.query(sql, { replacements: [ req.body.product_name, req.body.product_price, req.body.product_stock, req.body.product_review ], type: Product.sequelize.QueryTypes.INSERT }) // 通过插入返回的自增ID查询完整的新增数据 const insertedData = await Product.findByPk(insertResult.insertId) res.send({ message: "success add new product", data: insertedData }) } catch (err) { res.send({ message: err.message }) } }
内容的提问来源于stack exchange,提问作者Muhammad Haekal
相关产品推荐
相关产品推荐

