DetachedInstanceError: Instance <User at 0x32768d0> is not bound to a Session; attribute refresh operation cannot proceed
搜索了下找到了答案,这种情况主要是发生在 关闭数据库会话后,使用ORM的对用,获取对象的某些字段值,这时就会报错。

报错的原因也很简单,SQLAlchemy的ORM方式将数据库中的记录映射成了我们定义好的模型类,这些类对象的实例只在数据库会话(session)的生命期内有效,假如我们将数据库会话关闭了,再访问数据表类的对象就会报错。类似代码如下:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
 
Base = declarative_base()
 
 
class User(Base):
    __tablename__ = 'USER'
 
    id = Column(Integer, Sequence('USER_SEQ'), primary_key=True, autoincrement=True)
    name = Column(String(30))
    age = Column(Integer)
    status = Column(String(30))
 
 
engine = create_engine(str(db_url), encoding=b'utf-8', echo=echo, convert_unicode=True)
Session = sessionmaker(bind=engine)
session = Session()
 
user = User(name='John', age=30)
session.add(user)
session.commit()
session.close()
 
print user.name
运行到最后一行会抛出异常:

Traceback (most recent call last):
  File "E:\WorkCopy\test\test.py", line 21, in test_something
    print user.name
  File "C:\Python27\lib\site-packages\sqlalchemy\orm\attributes.py", line 237, in __get__
    return self.impl.get(instance_state(instance), dict_)
  File "C:\Python27\lib\site-packages\sqlalchemy\orm\attributes.py", line 573, in get
    value = state._load_expired(state, passive)
  File "C:\Python27\lib\site-packages\sqlalchemy\orm\state.py", line 480, in _load_expired
    self.manager.deferred_scalar_loader(self, toload)
  File "C:\Python27\lib\site-packages\sqlalchemy\orm\loading.py", line 610, in load_scalar_attributes
    (state_str(state)))
DetachedInstanceError: Instance <User at 0x32768d0> is not bound to a Session; attribute refresh operation cannot proceed
 那么如何在关闭Session 后还可以正常使用这个对象呢? 使用 session.expunge()。

user = User(name='John', age=30)
session.add(user)
session.commit()
 
session.refresh(user)
session.expunge(user)
 
session.close()
 
print user.name
使用 session.refresh(user) 是为了读取自增字段值(如果有的话)到 user 对象

原文链接:https://blog.csdn.net/mrqingyu/article/details/90372696

我用了一个笨办法——将orm对象转换为一个属性相同的普通对象:

class TaskTrackingRecord(db.Model):__tablename__ = "task_track"__table_args__ = {"extend_existing":True}id = db.Column(db.Integer, primary_key=True, autoincrement=True)sub_id = db.Column(db.String(128), nullable=False, unique=False)parent_id = db.Column(db.String(128), nullable=True, unique=False)root_id = db.Column(db.String(128), nullable=False, unique=False)name = db.Column(db.String(128), nullable=False, unique=False)call_category = db.Column(db.Integer, nullable=False, unique=False)state = db.Column(db.Integer, nullable=False, unique=False)timestamp = db.Column(db.Float, nullable=False, unique=False)desc = db.Column(db.String(1024), nullable=True, unique=False)def __repr__(self):return "<%s:%s %s:%s %s>" % (self.parent_id, self.sub_id, CallCategory(self.call_category).name, self.name, StatePoint(self.state).name)@propertydef full_name(self):return ""@staticmethoddef is_record_exist():passdef freeze(self):""":return:"""db.session.refresh(self)record = StatusRecord()record.sub_id = self.sub_idrecord.root_id = self.root_idrecord.parent_id = self.parent_idrecord.desc = self.descrecord.state = self.staterecord.call_category = self.call_categoryrecord.timestamp = self.timestampreturn record

Detached InstanceError:Instance is not bound to a Session 关闭session后使用SQLAlchemy对象相关推荐

  1. Hibernate数据保存操作方法的原理对比

    http://fantasyyong.iteye.com/blog/146685 首先看看中文翻译的Hibernate的Session的javadoc Interface Session All Su ...

  2. 超全的设计模式简介(45种)

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...

  3. 初中级程序员进阶高级程序员,必须要了解的设计模式(45种设计模式)

    设计模式(45种) 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是 ...

  4. java indexeddb_indexedDB 基本使用

    原标题:indexedDB 基本使用 来源:党黎明 (自荐投稿.他目前在深圳做前端开发) mr-dang.github.io/java/2017/12/09/indexedDB基本使用.html in ...

  5. Ganymed ssh小使用

    Ganymed SSH 目录 1 SSH简介 1 2 JAVA实现SSH的项目 1 3 GANYMED SSH 1 3.1 依赖说明 1 3.2 实现简单命令 1 3.2 实现SCP命令 1 SSH简 ...

  6. 10 04Hibernate之HibernateSessionFactory

    文章目录 1 ThreadLocal类的作用 2 HibernateSessionFactory分析 在使用MyEclipse创建Hibernate之后都会自动生成一个HibernateSession ...

  7. Hibernate之代码创建SessionFactory

    hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibe ...

  8. iOS——nil、Nil、NULL和[NSNull null]的区别

    iOS--nil.Nil.NULL和[NSNull null]的区别 首先我们先来看一下苹果文档上的解释: nil:Defines the id of a null instance.(定义空实例的i ...

  9. Removing a detached instance

    常用数据库表的删除办法,一般都会在DAO类中提供delete.如下例: public class UnitDAO implements IUnitDAO {         private Entit ...

  10. sqlalchemy.orm.exc.DetachedInstanceError: Instance

    sqlalchemy遇到了一个坑: 我的代码中有一个 item.forever_delete() 其中为了尝试db.session.close()进行手动处理,结果在这里出错了! sqlalchemy ...

最新文章

  1. chrome使用技巧(看了定不让你失望)
  2. Vue中的基础过渡动画原理解析
  3. Xcode7  创建纯代码的项目
  4. 当singleton Bean依赖propotype Bean,可以使用在配置Bean添加look-method来解决
  5. 吸尘器电机拆解图解_老少皆宜居家清理更轻松?吉米A6上手把无线吸尘器体验...
  6. 谷歌浏览器无网络连接 打不开网页解决办法
  7. 在2020年学习cocos游戏引擎
  8. 信息安全工程师笔记-综合知识冲刺(一)
  9. 2021杨铭杰高考成绩查询,谁知道汕头一中2007年高考成绩的概况
  10. 数据分析_金额业务数据知识
  11. SVG 动画(animate、animateTransform、animateMotion)
  12. Java复合函数循环_Java函数式编程(一)(示例代码)
  13. linux主机使用rdesktop连接windows进行usb重定向
  14. IPv6下一代互联网现在就出发!
  15. Thinkpad T410i-2516A21 安装Ubuntu10.0.4记录
  16. YOLOv5网络详解
  17. java libmp3lame_利用libmp3lame实现在Android上录音MP3文件示例
  18. (二)mybatisPlus实现ActiveRecord(AR)操作
  19. Python画五角星(turtle初识)
  20. pscc改变图片字体大小

热门文章

  1. 计算机键盘没有fn,键盘Fn键失灵怎么解决?键盘Fn键失灵的修复方法
  2. python爬裁判文书网_记录用web scraper爬取裁判文书网的文书列表信息以及批量下载word文书...
  3. KVM虚拟化技术实践
  4. vim插入模式快捷键
  5. 安卓 IOS上架流程
  6. Google Play上架总结(三)Google Play 上架流程
  7. 埃加洛尔虚拟服务器,致我终将逝去的二区:新一轮大服务器实装
  8. 【微信小程序系列:三】前端实现微信支付与代扣签约
  9. 约瑟夫环问题java_Java求解约瑟夫环问题
  10. 固态硬盘颗粒:SLC/MLC/TLC区别