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)
。