2016-11-18 6 views
0

내 데이터베이스 레코드를 삭제할 수 없습니다 둘 다 내가 그들을 삭제할 수없는 레코드가 포함되어 있습니다! 나는이 일을하고내가이 두 테이블이

:

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 
    ) 
) 

, 나는 공연이 항상 정확히 일일 다루 것을 알고있다 - 지금.