Answers:
您的示例代码应该已经按原样工作。SQLAlchemy应该为其提供一个值f.id
,并假设其为自动生成的主键列。主键属性在flush()
生成时立即在过程中填充,并且不需要调用commit()
。因此,这里的答案在于以下一项或多项:
我遇到了同样的问题,经过测试,我发现这些答案中没有一个是足够的。
当前,或者从sqlalchemy .6+开始,有一个非常简单的解决方案(我不知道它是否存在于以前的版本中,尽管我认为确实存在):
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.
就是这样。
sessionmaker(autoflush=True)
,w / refresh()组合为我提供了行ID。#grrr
flush()
使用commit()
它,而是在此之后-用刷新它session.refresh(f)
,对我有用,我使用SQLAlchemy版本0.6.7
与dpb给出的答案不同,不需要刷新。刷新后,您可以访问id字段,sqlalchemy会自动刷新在后端自动生成的id
我遇到了这个问题,经过一番调查后找出了确切的原因,我的模型是用id作为integerfield创建的,而在我的表单中,id用hiddenfield表示(因为我不想在表单中显示id)。默认情况下,隐藏字段表示为文本。一旦我使用widget = hiddenInput()将表单更改为integerfield,问题就解决了。
您应该尝试使用session.save_or_update(f)
而不是session.add(f)
。
save_or_update
从0.5左右开始不推荐使用。session.add()
应该这样做。
echo=True
,并查看在刷新时执行什么SQL吗?您描述的内容应该可以正常工作并提供ID,但是可能还有其他一些问题导致f.id为None。