Sequelize如何获取新增记录的自增ID(无需额外查询)
问题:Sequelize插入自增ID记录后无法获取返回的ID
我有一个int类型的自增id列,执行save操作插入记录时传入的是DEFAULT,希望获取新增记录的id但不想执行额外查询。尝试了以下代码,但返回的auditWithAssignedId的id始终是undefined:
void audit.save().then(auditWithAssignedId => { console.log('auditWithAssignedId', auditWithAssignedId); this.backup(auditWithAssignedId); });
对应的模型定义如下:
AccountAudit.init( { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, }, account: { type: DataTypes.STRING }, action: { type: DataTypes.STRING }, executedOn: { type: DataTypes.DATE, defaultValue: DataTypes.Now }, }, { sequelize, schema: 'AUDITS', tableName: 'ACCOUNT', underscored: true, timestamps: false, } }); export class AccountAudit extends Model< InferAttributes<AccountAudit>, InferCreationAttributes<AccountAudit> > { declare id: CreationOptional<number>; declare account: string; declare action: AuditAction; declare executedOn: CreationOptional<Date>; }
解决方案
1. 避免显式设置id为DEFAULT
创建audit实例时,不要手动给id赋值为DEFAULT,Sequelize会自动处理自增主键逻辑。如果显式设置id: DEFAULT,会干扰自增机制,导致插入后无法正确返回id。正确的实例创建方式只需传入业务字段:
const audit = AccountAudit.build({ account: '目标账户', action: '操作类型' });
2. 显式配置returning: true
部分数据库(如PostgreSQL)需要显式声明返回插入后的字段,MySQL虽默认支持,但显式配置更稳妥。在save方法中添加该配置:
audit.save({ returning: true }).then(auditWithAssignedId => { console.log('新增记录ID:', auditWithAssignedId.id); });
3. 核对数据库表结构
确保数据库中AUDITS.ACCOUNT表的id列确实被设置为自增主键,避免模型定义与实际表结构不一致导致的问题。
4. 改用create方法直接创建并返回实例
create方法是Sequelize推荐的创建记录方式,会自动返回包含自增ID的完整实例,无需额外配置:
AccountAudit.create({ account: '目标账户', action: '操作类型' }).then(auditWithAssignedId => { console.log('新增记录ID:', auditWithAssignedId.id); this.backup(auditWithAssignedId); });
内容的提问来源于stack exchange,提问作者LazioTibijczyk
相关产品推荐
相关产品推荐

