Sqlalchemy session.refresh不刷新obj

2024-04-24 19:26:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下映射(直接来自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'。

我在这里遗漏了什么?

谢谢!


Tags: namefromimportfalsedbstringsqlalchemysession
3条回答

docs

Note that a highly isolated transaction will return the same values as were previously read in that same transaction, regardless of changes in database state outside of that transaction

SQLAlchemy使用一个事务工作单元模型,其中每个事务都假设是内部一致的。会话是事务顶部的接口。由于事务被认为是内部一致的,SQLAlchemy只会(好吧,不完全是,但为了便于解释……)从数据库中检索给定的数据,并在每个事务中更新一次相关对象的状态。由于您已经在同一个会话事务中查询了对象,SQLAlchemy不会在该事务范围内再次从数据库更新该对象中的数据。如果要轮询数据库,则每次都需要使用一个新事务进行轮询。

session.refresh()对我也不起作用。即使我看到一个低级别的选择,对象在刷新后也没有更新。

这个答案https://stackoverflow.com/a/11121788/562267暗示要执行实际的提交/回滚来重置会话,这对我很有用:

user_1 = session.query(User).filter(User.id==1).one()
user_1.name # This prints: u'user1'
# update the database from another client here
session.commit()
user_1 = session.query(User).filter(User.id==1).one()
user_1.name # Should be updated now.

您是否按照官方文档中的描述尝试使用“expire”:

http://docs.sqlalchemy.org/en/rel_0_8/orm/session.html#refreshing-expiring

# expire objects obj1, obj2, attributes will be reloaded
# on the next access:
session.expire(user_1)
session.refresh(user_1)

对对象使用expire会导致在下次访问时重新加载。

相关问题 更多 >