我有以下映射(直接来自SA示例):
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
我正在使用一个MySql数据库,这个表有一个innoDB引擎。
我桌上只有一张唱片: 1 |“用户1”|“用户1测试”|“密码”
我已使用以下代码打开会话:
from sqlalchemy.orm.session import sessionmaker
from sqlalchemy.engine import create_engine
from sqlalchemy.orm.scoping import scoped_session
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
db_engine = create_engine('mysql://...@localhost/test_db?charset=utf8',echo=False,pool_recycle=1800)
session_factory = sessionmaker(bind=db_engine,autocommit=False,autoflush=False)
session_maker = scoped_session(session_factory)
session = session_maker()
user_1 = session.query(User).filter(User.id==1).one()
user_1.name # This prints: u'user1'
现在,当我将数据库中记录的名称更改为“user1_change”并提交它,然后按如下方式刷新对象时:
session.refresh(user_1)
user_1.name # This still prints: u'user1' and not u'user1_change'
它仍然会打印:u'user1'而不是u'user1_change'。
我在这里遗漏了什么?
谢谢!
从docs:
SQLAlchemy使用一个事务工作单元模型,其中每个事务都假设是内部一致的。会话是事务顶部的接口。由于事务被认为是内部一致的,SQLAlchemy只会(好吧,不完全是,但为了便于解释……)从数据库中检索给定的数据,并在每个事务中更新一次相关对象的状态。由于您已经在同一个会话事务中查询了对象,SQLAlchemy不会在该事务范围内再次从数据库更新该对象中的数据。如果要轮询数据库,则每次都需要使用一个新事务进行轮询。
session.refresh()对我也不起作用。即使我看到一个低级别的选择,对象在刷新后也没有更新。
这个答案https://stackoverflow.com/a/11121788/562267暗示要执行实际的提交/回滚来重置会话,这对我很有用:
您是否按照官方文档中的描述尝试使用“expire”:
http://docs.sqlalchemy.org/en/rel_0_8/orm/session.html#refreshing-expiring
对对象使用expire会导致在下次访问时重新加载。
相关问题 更多 >
编程相关推荐