You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask SQLAlchemy插入新记录时如何自动将主键user_id存入du_id字段

Flask SQLAlchemy 插入记录时同步主键到du_id字段的实现方法

这里提供2种常用的无侵入实现方案,不需要修改业务层插入逻辑:


方案1:使用ORM事件监听器(推荐)

监听模型的after_insert事件,主键生成后自动同步到du_id字段,全程不需要修改业务插入代码:

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import event

db = SQLAlchemy()

class User(db.Model):
    user_id = db.Column(db.Integer, primary_key=True)
    du_id = db.Column(db.Integer)
    name = db.Column(db.NVARCHAR(20))
    # 其他字段...

# 绑定插入后触发的事件
@event.listens_for(User, 'after_insert')
def sync_id(mapper, connection, target):
    # 此时user_id已自动生成,直接更新同一条记录的du_id字段
    connection.execute(
        User.__table__.update()
        .where(User.user_id == target.user_id)
        .values(du_id=target.user_id)
    )
  • 优势:逻辑和模型定义绑定,所有插入User的场景都会自动同步字段,不会漏处理。

方案2:重写模型保存方法

如果项目习惯封装模型的增删改方法,也可以在自定义save方法里完成同步:

class User(db.Model):
    user_id = db.Column(db.Integer, primary_key=True)
    du_id = db.Column(db.Integer)
    name = db.Column(db.NVARCHAR(20))
    # 其他字段...

    def save(self):
        db.session.add(self)
        db.session.flush() # 触发数据库生成主键,此时self.user_id已经有值
        self.du_id = self.user_id
        db.session.commit()

使用时直接调用实例的save方法即可:

new_user = User(name="测试用户")
new_user.save()

临时手动处理参考

如果只是个别场景需要临时处理,可以在插入逻辑里加一行flush操作获取主键后赋值:

new_user = User(name="测试用户")
db.session.add(new_user)
db.session.flush() # 拿到自动生成的user_id
new_user.du_id = new_user.user_id
db.session.commit()

内容的提问来源于stack exchange,提问作者Vishak Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:06:04