医生说 (在链接部分的末尾):
会话在数据库中插入新行后,所有新生成的标识符和数据库生成的缺省值都将立即或通过加载优先访问在实例上可用。
immediately和load-on-first-access有什么区别?SQLAlchemy在完成INSERT操作后不知道新的标识符和缺省值,那么即使没有重新加载,它们也不会变得可用吗?
发布于 2016-09-14 21:01:16
SQLAlchemy对支持它的DBs使用INSERT .. RETURNING来获取主键,或者使用mysql_insert_id之类的特殊函数来获取不支持它的DBs。
对于默认值,它尝试使用RETURNING,但如果不支持它,则必须使用另一个SELECT。
此外,在特定情况下(例如,当RETURNING语句被批处理时,请参见这个邮寄名单的帖子),可能不可能在特定情况下使用INSERT (即使是在受支持的DB上)。
最后,SQLAlchemy在默认情况下只在INSERT之后获取主键。因此,只有主键“立即”可用,而未配置的默认列是“负载优先访问”。如果需要它来获取生成的值,请指定server_default=FetchedValue()。(在DB不支持RETURNING并且为列指定FetchedValue的情况下,我不确定它是否仍然使用直接SELECT获取值,还是简单地返回到“负载优先访问”。)
发布于 2016-09-15 08:45:31
立即: SQLAlchemy从数据库中获取插入的每个会话对象的主键,并将其分配给会话对象。会话对象需要立即使用主键,因为在提交事务快照之前,该对象进入持久状态,并添加到Identity Map集合中,该集合将其键放在主键上。[ SQLAlchemy会议-深度]
与对象关联的load-on-first-access:数据库生成的默认值可能永远不会在其会话中使用。因此,为了节省资源,这些都是需要的懒惰负载。
https://stackoverflow.com/questions/39495181
复制相似问题