SQLAlchemy:谁负责“会话”?(以及如何使用会话进行单元测试)

2024-10-01 19:19:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一些关于如何在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? 让映射对象自动地将它们自己添加到数据库中是否可以?还是会惹麻烦?在


Tags: and对象数据库childnewobjectsqlalchemysession
1条回答
网友
1楼 · 发布于 2024-10-01 19:19:41

会话就像一个存储对象的盒子。当然,您可以编写__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。在

相关问题 更多 >

    热门问题