在Sqlalchemy中,使用session.add()添加对象并刷新后,session.query()为何不能返回该对象?

0 投票
1 回答
4922 浏览
提问于 2025-04-16 02:11

在使用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

撰写回答