如何批量刷新SQLAlchemy生成的多条对象实例?
错误根因
Session.refresh() 仅支持传入单个ORM映射实例,你直接向该方法传入users列表对象,才会触发sqlalchemy.orm.exc.UnmappedInstanceError: Class 'builtins.list' is not mapped报错。
解决方案
有两种常用的修复方案:
方案1:循环逐个刷新实例
适合小批量插入场景,直接替换原有的db.refresh(users)逻辑即可:
def seed_users(db: Session, number: int = 50): users = [] for _ in range(number): user_seed = { 'first_name': f.first_name(), 'last_name': f.last_name(), 'email_address': f.ascii_company_email() } users.append(models.User(**user_seed)) db.bulk_save_objects(users) db.commit() # 替换原有批量refresh逻辑 for user in users: db.refresh(user) return users
方案2:批量插入时直接回填字段(更高效)
在调用bulk_save_objects时新增return_defaults=True参数,插入完成后会自动将数据库生成的字段(如自增主键、默认值字段)回填到所有实例中,无需额外调用refresh,性能远高于方案1,适合大量数据插入场景,Postgres原生支持该参数:
def seed_users(db: Session, number: int = 50): users = [] for _ in range(number): user_seed = { 'first_name': f.first_name(), 'last_name': f.last_name(), 'email_address': f.ascii_company_email() } users.append(models.User(**user_seed)) db.bulk_save_objects(users, return_defaults=True) db.commit() return users
内容的提问来源于stack exchange,提问作者Natnael
相关产品推荐
相关产品推荐

