sqlalchemy刷新()并获得插入ID?

我想要做这样的事情:

f = Foo(bar='x') session.add(f) session.flush() # do additional queries using f.id before commit() print f.id # should be not None session.commit() 

但是,当我尝试它时,f.id是None。 我怎样才能使这个工作?

-担

您的示例代码应该照原样运行。 Sqlalchemy应该为f.id提供一个值,假定它是一个自动生成的主键列。 主键属性会在生成时立即在flush()过程中被填充,并且不需要调用commit()。 所以这里的答案就在于你的映射的细节,如果后端有任何奇怪的使用(例如,SQLite不会为复合主键生成整数值)和/或当你发出的SQL说什么打开回声。

我刚刚遇到同样的问题,经过testing,我发现这些答案都没有。

目前,或者像sqlalchemy .6+,有一个非常简单的解决scheme(我不知道这是否存在于以前的版本,但我想它是这样):

session.refresh()

所以,你的代码看起来像这样:

 f = Foo(bar=x) session.add(f) session.flush() # At this point, the object f has been pushed to the DB, # and has been automatically assigned a unique primary key id f.id # is None session.refresh(f) # refresh updates given object in the session with its state in the DB # (and can also only refresh certain attributes - search for documentation) f.id # is the automatically assigned primary key ID given in the database. 

这是如何做到这一点。

不像dpb给出的答案,刷新是没有必要的。 一旦你刷新,你可以访问id字段,sqlalchemy会自动刷新在后端自动生成的id

我遇到了这个问题,并经过一番调查后发现了确切的原因,我的模型是用id作为整数字段创build的,在我的表单中,id用hiddenfield表示(因为我不想在表单中显示id)。 隐藏字段默认表示为文本。 一旦我改变了窗体为整数字段的widget = hiddenInput()),问题就解决了。

在调用session.add方法之前,我曾经有一个分配0的问题。 数据库正确分配了id,但在session.flush()之后没有从会话中检索到正确的id。

你应该尝试使用session.save_or_update(f)而不是session.add(f)