SQLAlchemy 2.0语法删除记录提示Row类未映射如何解决?
报错原因
SQLAlchemy 2.0 语法中,session.execute() 返回的结果是sqlalchemy.engine.row.Row对象的迭代器,并非直接返回ORM映射实例。你查询整个Player实体时,每个Row对象会将查询到的Player实例存储在第一个元素位置,直接将Row对象传入仅接受已映射ORM实例的session.delete()方法,就会触发未映射实例错误。
解决方法
以下是三种常用解决方案:
- 方案1:从Row对象中取出ORM实例再执行删除
del_records = session.execute(sa.select(Player).where(Player.id_ <= 10)) for d in del_records: session.delete(d[0]) session.commit()
- 方案2:使用
scalars()方法直接获取ORM实例迭代器
del_records = session.execute(sa.select(Player).where(Player.id_ <= 10)).scalars() for d in del_records: session.delete(d) session.commit()
- 方案3:使用批量删除语法(适合大批量删除场景,性能更优,无需将数据加载到内存)
session.execute(sa.delete(Player).where(Player.id_ <= 10)) session.commit()
内容的提问来源于stack exchange,提问作者Jossy
相关产品推荐
相关产品推荐

