在Sqlalchemy中,如果我使用session.add()添加一个对象并刷新它,session.query()不会给出该对象,为什么?

Che*_*ezo 0 python sql orm sqlalchemy

使用SQLAlchemy时,我使用session.add(objname)向会话添加一个对象,然后使用session.flush显式刷新它,或者在创建引擎本身时启用autoflush = True.

现在在会话中,如果想通过session.query(classname).all()返回该对象,我无法检索它.

为什么会这样?或者有没有一种方法,query()也可以检索刷新的对象.

nos*_*klo 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()   
Run Code Online (Sandbox Code Playgroud)

完成设置后,添加新用户:

s = create_session(autocommit=False, autoflush=False)
u = User()
u.name = u'Cheezo'
s.add(u)
s.flush()
Run Code Online (Sandbox Code Playgroud)

然后查询回来:

>>> u2 = s.query(User).first()
>>> print u2.name
Cheezo
>>> u2 is u
True
Run Code Online (Sandbox Code Playgroud)

  • @Cheezo:我不知道.它应该工作.也许你应该提供一个小的,有效的脚本来重现问题 - 或者只是以一种再现问题的方式修改我的脚本.我尝试添加许多级别的功能,一切正常.所以,正如我在答案的第一句中所说的**请提供我可以运行以重现它的示例代码**. (2认同)