我的基本关系定义如下: db =数据库(' sqlite',' test_db.sqlite',create_db = True)
class WOEID(db.Entity):
woeid = PrimaryKey(int)
iso = Optional(str)
name = Required(str)
language = Optional(str)
place_type = Required(str)
parent_id = Required(int)
trends = Set('Trend')
ancestry = Optional(str)
class Trend(db.Entity):
woeid = Required(int)
events = Optional(str)
name = Required(str)
promoted_content = Optional(str)
query = Required(str)
url = Required(str)
location = Optional(WOEID)
db.generate_mapping(create_tables=True)
现在,我在用@db_session修饰的函数中向WOEID.trends添加了一些项目。这按预期工作。 现在我尝试通过首先使用
读取对象来更新WOEID.trends location = WOEID.get(woeid = some_woeid)
稍后我发出
location.trends.clear()
删除旧条目,然后向趋势集添加新项目。
在此操作之后生成的趋势表中,我添加了项目,但之前的项目(从集合中清除)不会被删除,它们将保留在数据库中,并且位置为'字段为空(我猜它们被解除引用)。
如何执行上述操作以阅读孤立的项目?
答案 0 :(得分:3)
PonyORM中有两种一对多关系。第一种关系是关系的一端是Set
而关系的另一端是Required
。在这种情况下,当您从集合中删除项目时,此项目将被删除。例如,我们可以通过以下方式定义两个实体Article
和Comment
:
class Article(db.Entity):
author = Required(User)
text = Required(str)
comments = Set('Comment')
class Comment(db.Entity):
author = Required(User)
text = Required(str)
article = Required(Article)
在这种情况下,当您执行article.comments.clear()
时,所有评论都将被删除,因为Comment.article
属性是必需的,如果没有文章,评论就不会存在。
另一种关系是将Comment.article
属性定义为Optional
:
class Comment(db.Entity):
author = Required(User)
text = Required(str)
article = Optional(Article)
在这种情况下,评论可以在没有任何文章的情况下存在,当您从Article.comments
集合中删除评论时,它仍保留在数据库中,但Comment.article
属性值设置为{{1} }。
您可以通过执行以下查询找到孤立的项目:
NULL
或等同于
select(c for c in Comment if c.article is None)
在某些情况下,可能需要将属性定义为Comment.select(lambda c: c.article is None)
,但在从集合中删除项目时执行级联删除。为此,您可以为Optional
属性指定cascade_delete
选项:
Set
然后,如果您执行class Article(db.Entity):
author = Required(User)
text = Required(str)
comments = Set('Comment', cascade_delete=True)
class Comment(db.Entity):
author = Required(User)
text = Required(str)
article = Optional(Article)
,则将从数据库中删除所有已删除的注释。