与SQLAlchemy关系的SELECT条件

时间:2014-02-02 10:05:13

标签: python sql sqlalchemy

拥有这个SQLAlchemy模型:

class Post(db.Model):
    __tablename__ = 'posts'

    post_id = db.Column(db.Integer, primary_key=True)
    post_parent = db.Column(db.Integer, db.ForeignKey('posts.post_id'))

    children = db.relationship('Post')

如您所见,Post可以有子项(即Post不为0的post_parent个对象。对于从数据库中检索的每个Post,都会生成一个SELECT以检索其子项。没关系。

但是,在我的数据库设计中,post_parent不为0的Post不能有子项(即父帖子中的子项不能再包含子项)。但是要检索它们的SELECT。我怎么能避免这种情况?

1 个答案:

答案 0 :(得分:2)

在关系术语中,这里的任何Post都可以有子Post对象,因为所有Post对象都有一个主键,因此可以有任意数量的Post对象具有post_parent的那个键。所以说somepost.children必须发出SQL,否则SQLA将无法提供正确的结果。如果你的模型有一些特殊规则,一些Post对象在没有查询数据库的情况下就知道没有子节点,你需要有条件地访问“somepost.children”。但是,从关系的角度来看,你的断言“发布post_parent不为0的对象不能生孩子”是不正确的。此关系配置为一对多,因此任何Post都可以拥有与post_parent无关的子项。

如果另一方面你真的意味着Post.children是一个单一的,多对一的特定帖子,那么你需要在那个关系()上设置remote_side=post_id,你不会如果在这种情况下parent_post为None,则获取lazyload(虽然不是零,但这是非NULL值)。