【问题标题】:how to expunge foreign key record in sqlalchemy如何在 sqlalchemy 中删除外键记录
【发布时间】:2020-07-04 00:28:04
【问题描述】:

我正在使用 sqlalchemy 来管理我的数据库。 这些是我的桌子

class Series(Base):
    __tablename__ = "Series"
    id = Column("Id", Integer, primary_key=True, autoincrement=True)
    series_name = Column("SeriesName", Unicode(50), nullable=False, unique=True)


class Season(Base):
    __tablename__ = "Seasons"
    id = Column("Id", Integer, primary_key=True, autoincrement=True)
    series_id = Column(
        "SeriesId", Integer, ForeignKey(f"{Series.__tablename__}.Id"), nullable=False
    )
    season_number = Column("SeasonNumber", Integer, nullable=False)

    series = relationship("Series", uselist=False, lazy='joined', innerjoin=True)
    __table_args__ = (UniqueConstraint("SeriesId", "SeasonNumber", name="UQ_SeriesId_SeasonNumber"),)

class Episode(Base):
    __tablename__ = "Episodes"
    id = Column("Id", Integer, primary_key=True, autoincrement=True)
    episode = Column("Episode", Integer, nullable=False)
    episode_name = Column("EpisodeName", Unicode, nullable=True)
    season_id = Column(
        "SeasonId", Integer, ForeignKey(f"{Season.__tablename__}.Id"), nullable=False
    )

    season = relationship("Season", uselist=False, lazy='joined', innerjoin=True)
    __table_args__ = (UniqueConstraint("SeasonId", "Episode", name="UQ_SeasonId_Episode"),)


class DownloadStatus(aenum.Enum):
    Start = "Start"
    Processing = "Processing"
    Downloading = "Downloading"
    Finish = "Finish"


class Request(Base):
    __tablename__ = "DownloadRequests"
    id = Column("Id", Integer, primary_key=True, autoincrement=True)
    status = Column("Status", Enum(DownloadStatus), nullable=False)
    episode_id = Column(
        "EpisodeId", Integer, ForeignKey(f"{Episode.__tablename__}.Id"), nullable=True
    )

    episode = relationship("Episode", uselist=False, lazy='joined', innerjoin=True)

在我的代码中,我需要找到一个特定的请求,在我结束与 sql 服务器的会话后,我返回请求,在会话结束后,我想使用外键链接到该请求的情节但是当我尝试时使用request.episode 访问剧集我得到DetachedInstanceError 如何删除所有外键记录以及主记录?

【问题讨论】:

    标签: python-3.x sqlalchemy foreign-keys inner-join


    【解决方案1】:

    根据您的问题,我假设您的代码如下所示:

    first_request = session.query(Request).first()
    
    session.commit()
    session.close()
    
    first_request.episode
    

    虽然最后一行引发了一个 DetachedInstanceError,但其描述为 Episode 未绑定到您的对象 first_request

    我已经在我的仓库中重现了一些情况,请看https://github.com/Mizaro/stackoverflow/blob/master/60815309/models.py。 我已经展示了如何删除不同的对象。

    结论是,如果您想删除查询下的所有内容,最简单的解决方案是使用expunge_all

    喜欢这段代码:

    first_request = session.query(Request).first()
    session.expunge_all()
    
    session.commit()
    session.close()
    
    first_request.episode  # Will work.
    

    希望它已经回答了您的问题。

    祝你好运:)

    【讨论】:

    • 我认为您的意思是 session.expunge_all() (没有参数)。不过这是正确的,谢谢
    • @Yedidyakfir 谢谢 :)
    猜你喜欢
    • 2011-01-26
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多