我需要一些关于如何在SQLAlchemy中使用session
对象以及如何组织映射对象的单元测试的指导。在
我想做的是:
thing = BigThing() # mapped object
child = thing.new_child() # create and return a related object
thing.save() # will also save the child object
为了实现这一点,我考虑让BigThing
将自己(以及它的子对象)添加到数据库中——但这可能不是一个好主意?在
尽快添加对象的一个原因是数据库分配的自动id
值——它们越早可用,问题就越少(对吗?)在
管理session
对象的最佳方法是什么?
谁负责session
?
是否应该只在需要时创建它?还是保存了很长时间?在
我的映射对象的单元测试呢?。。。应该如何处理session
?
让映射对象自动地将它们自己添加到数据库中是否可以?还是会惹麻烦?在
会话就像一个存储对象的盒子。当然,您可以编写
__init__
方法来自动向其中添加对象,但这意味着它存在一些全局(唯一)会话。当然,这在很多情况下都会导致问题,但这也会简化代码的编写。这是显性与隐性的两难。有些人遵循Python的Zen,有些人则不这么做。我更喜欢指定一个显式存储的框。在注意,只要它通过关系与已经在会话中的对象相关联,就不需要显式地向会话中添加子对象。这就是cascading rules的作用。默认的
'save-update'
完全符合您的要求。您可能还对'all, delete-orphan'
来实现“private”对象感兴趣,这些对象应该与其父对象一起删除。在我看到了一些实现
save()
方法的问题。在当前版本的SQLAlchemy中,不能说“savethissobjects”。早期就有这样的能力,但从来都不可靠。Session.flush()
(从Session.commit()
调用)刷新数据库的所有更改。这可能是SQLAlchemy最讨厌的特性,它阻止我在某些项目中使用它。在单元测试非常简单(至少当您显式指定session时),see the sample code in other question。在
相关问题 更多 >
编程相关推荐