2016-11-18 4 views
0

У меня есть эти две таблицы:Невозможно удалить мои записи базы данных

class Performance(Base): 
    __tablename__ = 'performances' 
    id_ = Column(Integer, Sequence('performance_id_seq'), primary_key=True) 
    competitor_id = Column(Integer, ForeignKey('competitors.id_'), index=True) 
    start_date = Column(DateTime, nullable=False, index=True) 
    end_date = Column(DateTime, nullable=False, index=True) 
    target = Column(Float, nullable=True) 
    actual = Column(Float, nullable=True) 

    competitor = relationship("Competitor", backref="performances") 


class TargetAdjustment(Base): 
    __tablename__ = 'target_adjustments' 
    id_ = Column(Integer, Sequence('target_adjustments_id_seq'), primary_key=True) 
    competitor_id = Column(Integer, index=True) 
    start_date = Column(DateTime, nullable=False) 
    value = Column(Float, nullable=True) 

    __table_args__ = (ForeignKeyConstraint([competitor_id, start_date], [Performance.competitor_id, Performance.start_date]), {}) 

    performance = relationship('Performance', backref=backref("adjustment", uselist=False)) 


Index('target_adjustment_index', TargetAdjustment.competitor_id, TargetAdjustment.start_date, unique=True) 

(среди других, но они являются ключевыми для моего вопроса)

Теперь мне нужно удалить записи из этих таблиц, но когда они оба содержат записи, которые я не могу удалить!

Я делаю это:

competition = competitor.competition 

adjustment_query = DBSession.query(TargetAdjustment).filter(
    TargetAdjustment.competitor_id == competitor.id_ 
).filter(
    or_(
     TargetAdjustment.start_date <= competition.start_date, 
     TargetAdjustment.start_date >= competition.end_date 
    ) 
) 
# delete any extraneous adjustment data for this competitor 
log.warning("before: {}".format(adjustment_query.count())) 

adjustment_query.delete() 

DBSession.flush() 

log.warning("after: {}".format(adjustment_query.count())) 

# delete any extraneous performance data for this competitor 
DBSession.query(Performance).filter(
    Performance.competitor_id == competitor.id_ 
).filter(
    or_(
     Performance.start_date <= competition.start_date, 
     Performance.end_date >= competition.end_date 
    ) 
).delete() 
DBSession.flush() 

При попытке удалить записи «ПЕРФОРМАНС», заявление журнала показывает, что я удалил запись Эквивалентной «target_adjustments»,

WARNI: before: 0

WARNI: after: 0

Но я все равно получите эту ошибку.

"IntegrityError: (IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (target_adjustments , CONSTRAINT target_adjustments_ibfk_1 FOREIGN KEY (competitor_id , start_date) REFERENCES performances (competitor_id , start_date))') 'DELETE FROM performances WHERE performances.competitor_id = %s AND (performances.start_date <= %s OR performances.end_date >= %s)' (1128L, datetime.datetime(2016, 3, 31, 23, 0), datetime.datetime(2016, 6, 1, 23, 0))"

Почему я не могу удалить записи об исполнении?

+0

По-видимому, MySQL думает иначе. Вместо того, чтобы угадывать, вы могли бы проверить, были ли у вас какие-либо данные привязки, оставленные в таблице target_adjustments – Shadow

+0

. Я обратился к этому, сообщения журнала показывают, что нет соответствующих записей. –

ответ

0

Я разработал его.

Мой запрос на удаление фактически не соответствовал всем записям, так что в таблице все еще была запись настройки, когда я пытался удалить действия.

Обновленный код выглядит следующим образом:

adjustment_query = DBSession.query(TargetAdjustment).filter(
    TargetAdjustment.competitor_id == competitor.id_ 
).filter(
    or_(
     TargetAdjustment.start_date <= competition.start_date, 
     TargetAdjustment.start_date >= (competition.end_date - timedelta(days=1)) # adjust to match performance end date query 
    ) 
) 

К счастью, я знаю, что выступления всегда покрывает ровно один день - на данный момент.