在Sqlalchemy中,使用session.add()添加对象并刷新后,session.query()为何不能返回该对象?
在使用SQLAlchemy的时候,我通过session.add(objname)把一个对象添加到会话中,然后可以选择用session.flush来手动刷新,或者在创建引擎的时候把autoflush设置为True。
现在在这个会话里,如果我想通过session.query(classname).all()来返回那个对象,我却无法找到它。
这是为什么呢?或者有没有什么方法可以让query()也能找到已经刷新过的对象呢?
1 个回答
7
我无法重现你遇到的问题。请提供一些示例代码,这样我才能运行并复现这个问题。
这里有段代码,它实现了你所描述的功能,但表现得是我们所期望的样子:
from sqlalchemy import Column, Integer, Unicode, create_engine
from sqlalchemy.orm import create_session
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite://')
Base = declarative_base(bind=engine)
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(Unicode(60))
Base.metadata.create_all()
在那段代码设置好之后,添加一个新用户:
s = create_session(autocommit=False, autoflush=False)
u = User()
u.name = u'Cheezo'
s.add(u)
s.flush()
然后再查询这个用户:
>>> u2 = s.query(User).first()
>>> print u2.name
Cheezo
>>> u2 is u
True