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
相关产品推荐
相关产品推荐

