本文介紹了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)
,但由于我不需要將注釋顯式添加到會話中,因此我看不出為什么必須從會話中顯式刪除它。
我找到了幾種用于級聯刪除相關對象的解決方案,但由于我從未對會話發出任何顯式刪除(帖子仍在那里),我認為這不適用。
編輯:我調整了示例以包括從帖子中刪除的級聯?,F在它可以執行session.delete(post)
,并且所有評論都被刪除。但我只想自動刪除我從關系中刪除的評論,而不是刪除包含所有評論的整個帖子。
tl;dr:當我從一對多關系的關系列表中刪除條目時,如何告訴SQLAlChemy發出DELETE語句而不是UPDATE語句?
推薦答案
有關詳細信息,請閱讀文檔的Configuring delete/delete-orphan Cascade部分,但基本上您還需要delete-orphan
以及relationship
的cascade
選項:
class Post(Base):
# ...
comments = relationship('Comment', cascade="all, delete-orphan")
這篇關于SQLAlChemy:直接從一對多關系中刪除對象,而不使用會話。刪除()的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,