sqlalchemy: DetachedInstanceError: Instance <MyModel at 0x36bb190> is not bound to a Session; attribute refresh operation cannot proceed

最近重构微博爬虫,发现了这个问题

DetachedInstanceError: Instance is not bound to a Session; attribute refresh operation cannot proceed

这个问题发生的原因在于,当我们查询操作commit之后,被查询出来的结果对象就无法访问了,如果要让它还能访问,那么可以这样设置

eng = get_engine()
Base = declarative_base()
metadata = MetaData(get_engine())
# 添加expire_on_commit参数
SessionFactory = sessionmaker(bind=eng, expire_on_commit=False)
Session = scoped_session(SessionFactory)

此外,如果是要修改对象的属性,那么需要先将该对象以一个有效的session给merge起来

data.name='rookiefly'
# 这里需要注意merge的顺序,需要在倒数第二步
session.merge(data)
session.commit()