从序列中的插入中获取自动生成的(通过触发器)字段

时间:2019-02-11 17:07:13

标签: mysql sequelize.js

我有一个基本控制器,用于整个API的通用插入/更新操作,仅使用表字典,因此我们可以使用相同的函数将数据插入到许多表中。

问题是存在一个表,该表使用通过触发器生成的相关数字,当sequelize返回插入的值时,它包含新ID,但相关字段返回空,我需要它在界面上显示它。

我已经考虑过再次向API查询新字段,或者当它包含这些特定表名时再次在相同的save函数上查询它,但是有一种方法可以让续集“等待”这个新表生成值,然后返回数据好吗?就像获取新ID一样

或者这可能需要在数据库上修复?我在该领域经验不足,但是如果有帮助,我们正在使用MySQL。

function Init(models, dictionary) {
    this.post = (req, res, next) => {
        const { obj } = req.body;
        const model = models[dictionary[obj._type]];

        //Just stripping fields starting with "_"
        const objClear = {};
        for (const attr in obj) {
            if (attr.charAt(0) !== '_') {
                objClear[attr] = obj[attr];
            }
        }

        //Saving
        model.create(objClear).then(
            (objSaved) => {
                const data = {
                    obj: objSaved.get({ plain: true }),
                    action: 'inserted',
                };

                //I guess I could query the new row here again
                res.json(data);
            },
        ).catch(next);
    };
}
module.exports = {
    Init,
};

响应如下:

{"obj":{"TOTAL":"0","ID":14,...,"TRANSACTION_NO":""},"action":"inserted"}

其中TRANSACTION_NO是使用触发器生成的字段。

1 个答案:

答案 0 :(得分:1)

AFAIK,除非使用Postgres,否则您必须查询新行(在这种情况下,您可以尝试使用Model.create选项“ options.returning”)

两个无法解决问题的快速测试:

  • afterCreate挂钩-模型仍将触发器创建的字段显示为空。
  • 具有DB函数默认值的模型-该模型显示函数调用, 而不是函数的结果(确实会进入数据库字段)。

希望其他人有解决方案!