Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Sequelize on save()获取MySQL自动增量主键?_Mysql_Node.js_Sequelize.js - Fatal编程技术网

如何从Sequelize on save()获取MySQL自动增量主键?

如何从Sequelize on save()获取MySQL自动增量主键?,mysql,node.js,sequelize.js,Mysql,Node.js,Sequelize.js,我试图在Sequelize中插入新行,但不管我尝试什么,Sequelize都不会返回刚刚保存的自动递增行的ID。这是我的密码: if (isDefined(jsonObject.id) && jsonObject.id == 0) { let databaseObject = Database.getInstance().getModel(objectName).build(jsonObject); //databa

我试图在Sequelize中插入新行,但不管我尝试什么,Sequelize都不会返回刚刚保存的自动递增行的ID。这是我的密码:

        if (isDefined(jsonObject.id) && jsonObject.id == 0) {
            let databaseObject = Database.getInstance().getModel(objectName).build(jsonObject);
            //databaseObject.isNewRecord = true;
            // Does not exist
            //databaseObject.setNew(true);

            transform.setNew(true);
            transform.setJsonObject(jsonObject);
            transform.setDatabaseObject(databaseObject);

            return transform.populateJoins()
            //.then(() => transform.baseMetadata())
            //.then(() => transform.metadata())
            .then(() => transform.baseExtract())
            .then(() => transform.extract())
            //.then(() => transform.clean())
            .then(() => {
                console.log('DATABASE OBJECT PRE SAVE: ');
                console.log(transform.getDatabaseObject());
                return transform.getDatabaseObject().save({
                    returning: true
                });

            }) // function () { return ; }
            .then((data) => {
                if (data instanceof sequelize.ValidationError) {
                    for (var field in data) {
                        this.addError(res.locals, ErrorCode.InvalidValue, field + ': ' + data[field]);
                    }
                    return false;
                } else {
                    return Database.getInstance().getConnection().query('SELECT LAST_INSERT_ID();')
                    .then((row) => {
                        console.log('LAST INSERT ID: ');
                        console.log(row);
                        transform.getDatabaseObject().set('id', row[0]);
                        return transform.getDatabaseObject();
                    });
                }
            })
            //.then(() => transform.getDatabaseObject()) // function () {   return ; }
            .then((data) => {
                //console.log('Data is ' + typeof data);                
                console.log('NEW POST json: ');
                console.log(jsonObject);
                console.log('NEW POST data: ');
                console.log(data);
                console.log(data.get('id'));
                if (jsonObject['id'] == data.get('id')) {
                    this.addError(res.locals, ErrorCode.InvalidValue, 'New object provided did not auto-increment.');
                    return false;
                }

                let dtoObject = {};
                //for (var i in data.dataValues) {
                //  dtoObject[toCamelCase(i)] = data.get(i);
                //}
                for (let i in transform.columns) {
                    dtoObject[i] = data.get(transform.columns[i].name);
                }
                //if (jsonObject.id == data.get('id')) {
                //  throw new FrontendError(ErrorCode.InvalidValue, 'New object provided did not auto-increment.');
                //}
                res.locals.retval.addData(dtoObject);
但是,我始终收到提供的
新对象未自动递增。
异常,因为返回的数据库对象始终具有ID 0,尽管已保存到我的数据库(ID 273567):


看起来我正在用一个变量重写isNewRecord方法,但我删除了该代码,它似乎没有做任何更改。

我在bulkCreate中遇到了类似的问题。我得到了选项
returning:true
的帮助。 我的代码:

return EventLog.bulkCreate(records, {
    returning: true
});

这是我能找到的从Sequelize获取自动增量主键的最简单解决方案。这是一个非常丑陋的解决方案,但如果它奏效,它就会奏效

                return Database.getInstance().getConnection().transaction((t) => {
                    return transform.getDatabaseObject().save({
                        transaction: t
                    })
                    .then((data) => {
                        if (data instanceof sequelize.ValidationError) {
                            for (var field in data) {
                                this.addError(res.locals, ErrorCode.InvalidValue, field + ': ' + data[field]);
                            }
                            return false;
                        } else {
                            return Database.getInstance().getConnection().query('SELECT LAST_INSERT_ID() as `id`;', { transaction: t, type: sequelize.QueryTypes.SELECT })
                            .then((row) => {
                                console.log('LAST INSERT ID: ');
                                console.log(row);
                                transform.getDatabaseObject().set('id', row[0]['id']);
                                transform.getDatabaseObject().setDataValue('id', row[0]['id']);

                                console.log('DATABASE OBJECT POST SAVE: ');
                                console.log(transform.getDatabaseObject());
                                return transform.getDatabaseObject();
                            });
                        }
                    })
                })

啊,那你就上PostgreSQL了。显然,该选项与MySQL不兼容。我甚至找到了获取SQLite自动增量的选项,但看起来我必须使用
LAST\u INSERT\u ID()
                return Database.getInstance().getConnection().transaction((t) => {
                    return transform.getDatabaseObject().save({
                        transaction: t
                    })
                    .then((data) => {
                        if (data instanceof sequelize.ValidationError) {
                            for (var field in data) {
                                this.addError(res.locals, ErrorCode.InvalidValue, field + ': ' + data[field]);
                            }
                            return false;
                        } else {
                            return Database.getInstance().getConnection().query('SELECT LAST_INSERT_ID() as `id`;', { transaction: t, type: sequelize.QueryTypes.SELECT })
                            .then((row) => {
                                console.log('LAST INSERT ID: ');
                                console.log(row);
                                transform.getDatabaseObject().set('id', row[0]['id']);
                                transform.getDatabaseObject().setDataValue('id', row[0]['id']);

                                console.log('DATABASE OBJECT POST SAVE: ');
                                console.log(transform.getDatabaseObject());
                                return transform.getDatabaseObject();
                            });
                        }
                    })
                })