【Python】flask-sqlalchemy两种用法

db.session.query() 从整个会话进度去查询数据,commit数据,基于session.query均可以查询

db.session.commit()数据会刷新到数据库中,但是没有更新模型数据,即mode.query查不到刚才commit的相关数据

问题解决

sqlalchemy.orm.exc.DetachedInstanceError: Instance <EntityMedicamentVariety at 0x2675fef6978> is not bound to a Session; attribute refresh operation cannot proceed (Ba
ckground on this error at: http://sqlalche.me/e/bhk3)

分析:

commit后,会将session内所有对象进行提交并删除,后续session内无对象,需要手动add。

SQlAlchemy的ORM方式将数据库的记录映射成用户定义好的模型类,这些类对象的实例只在数据库的session生命期内有效,若关闭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 对象
发布了61 篇原创文章 · 获赞 2 · 访问量 7303

猜你喜欢

转载自blog.csdn.net/hebaojing/article/details/103021973
今日推荐