我有以下的SQLAlchemy设置:
Base = declarative_base()
class Post(Base):
__tablename__ = 'post'
id = Column(Integer, primary_key=True)
title = Column(String(30))
comments = relationship('Comment', cascade='all')
class Comment(Base):
__tablename__ = 'comment'
id = Column(Integer, primary_key=True)
post_id = Column(Integer, ForeignKey(Post.id, ondelete='CASCADE'), nullable=False)
text = Column(Text)
通过这个方式,我可以创建一个帖子对象,并与评论形成一对多的关系。我想处理与会话无关的帖子评论的创建和删除。将评论添加到帖子中完全没有问题:
post = Post(title='some post')
comment = Comment(text='some comment')
post.comments.append(comment)
我的会话处理程序只知道帖子,所以它会执行 session.add(post)
,评论会自动放入会话中,并在下一个 session.commit()
中与数据库同步。不过,删除评论就不是这样了。我想通过以下方式能够删除评论:
post.comments.remove(comment)
然而,在下一个 session.commit()
中会出现以下错误:
sqlalchemy.exc.OperationalError: (OperationalError) (1048, "Column 'post_id' cannot be null") 'UPDATE comment SET post_id=%s WHERE comment.id = %s' (None, 1L)
如何告诉SQLAlchemy,在post_id列上由于非空约束而不允许使用NULL值的情况下,不要更新评论,而是删除评论?我知道我可以使用session.delete(comment)
,但由于我没有显式地向会话添加评论,因此我认为我不需要显式地从会话中删除它。我找到了几个解决相关对象级联删除的解决方案,但由于我从未向会话发出任何显式删除请求(帖子仍然存在),所以我认为这种方法不适用。编辑:我调整了示例,以包括从帖子进行级联删除。现在可以通过
session.delete(post)
实现并删除所有评论。但我只想自动删除我从关系中移除的评论,而不是删除带有所有评论的整个帖子。TL;DR:如何告诉SQLAlchemy在一对多关系的关系列表中删除一个条目时发出删除语句而不是更新语句?
delete-orphan
选项,从关系列表中删除时的删除操作按预期工作。谢谢。 - Varicus