2012-05-06 69 views
1

我有一个Web应用程序,用户可以在其中创建和编辑文章。每篇文章编辑都会创建一个新版本。我使用SQLAlchemy作为ORM。现在我滥用flush()调用吗?

,每次我创建了一篇文章,这是发生了什么:

# Create the article 
    article = Article(...) 
    session.add(article) 
    session.flush() 

    # Create the revision 
    revision = Revision(article.id, ...) 
    session.add(revision) 
    session.flush() 

    # Set article's `current_revision_id` field to the revision's id 
    article.current_revision_id = revision.id 

    session.commit() 

我之所以要调用flush(),每次是这样我就可以得到的文章和修订的ID。文章和修订版都不能提交到数据库,直到他们引用了彼此的ID。

我的问题是这是否是一个理智的事情。如果很多人同时创建一篇文章,是否有可能从flush()调用中分配的ID不成立?这是否可以接受为“交易”?

回答

4

代替在您的代码中使用ID,请使用SQLAlchemy的relationship system

article = Article(...) 
revision = Revision(article, ...) 
article.current_revision = revision 
session.add(article) 
session.commit() 
+0

这样做给了我一个CircularDependencyError。我相信这是因为一篇文章有​​很多修改。但其修订也回到了文章中。 – trinth

+2

这确实不是一个简单的例子。我认为你需要'current_revision'关系中的'post_update = True' – ThiefMaster

+0

哇我一直在试图找到关于“指向自己/相互依赖的行的行”的文档。不仅你的post_update =真正的评论工作,但它帮助我找到该页面!如果你不介意问我,我是否应该喜欢在你的例子中传递和设置模型对象而不是id?再次感谢你的帮助! – trinth