2016-11-18 19 views
0

私のデータベースレコードを削除することはできませんどちらも私はそれらを削除することはできませんレコードを含む!は、私はこの2つのテーブルを持っている

私は、このやっている:

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

私は「パフォーマンス」レコードを削除しようとすると、ログ・ステートメントが

WARNI: before: 0

WARNI: after: 0

、私は同等の「target_adjustments」レコードを削除したことを証明している。しかし、私を依然としてこのエラーが発生します。

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

、私は公演が常に正確に1日をカバーしていることを知っている - 今のところは。

関連する問題