SQLAlChemy:直接从一对多关系中删除对象,而不使用会话。删除() [英] SQLAlchemy: Delete object directly from one-to-many relationship without using session.delete()

查看:57
本文介绍了SQLAlChemy:直接从一对多关系中删除对象,而不使用会话。删除()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下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 = Post(title='some post')
comment = Comment(text='some comment')
post.comments.append(comment)

我的会话处理程序只知道POST,所以它将执行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值更新注释(由于列上的NOT NULL约束,这是不允许的),而是删除该注释?我知道我可以这样做session.delete(comment),但由于我不需要将注释显式添加到会话中,因此我看不出为什么必须从会话中显式删除它。

我找到了几种用于级联删除相关对象的解决方案,但由于我从未对会话发出任何显式删除(帖子仍在那里),我认为这不适用。

编辑:我调整了示例以包括从帖子中删除的级联。现在它可以执行session.delete(post),并且所有评论都被删除。但我只想自动删除我从关系中删除的评论,而不是删除包含所有评论的整个帖子。

tl;dr:当我从一对多关系的关系列表中删除条目时,如何告诉SQLAlChemy发出DELETE语句而不是UPDATE语句?

推荐答案

有关详细信息,请阅读文档的Configuring delete/delete-orphan Cascade部分,但基本上您还需要delete-orphan以及relationshipcascade选项:

class Post(Base):
    # ...
    comments = relationship('Comment', cascade="all, delete-orphan")

这篇关于SQLAlChemy:直接从一对多关系中删除对象,而不使用会话。删除()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆