как удалить запись внешнего ключа в sqlalchemy - PullRequest
0 голосов
/ 23 марта 2020

Я использую 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)

В моем коде мне нужно найти конкретный c запрос, после завершения сеанса с сервером sql я возвращаю запрос, после завершения сеанса хочу использовать эпизод, связанный с этим запросом, с внешним ключом, однако, когда я пытаюсь получить доступ к эпизоду с помощью request.episode, я получаю DetachedInstanceError как я могу удалить запись всех внешних ключей вместе с основной записью?

1 Ответ

0 голосов
/ 25 марта 2020

Исходя из вашего вопроса, я предполагаю, что ваш код выглядит примерно так:

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.

Надеюсь, он ответил на ваш вопрос.

Удачи:)

...