2016-11-18 44 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 
    ) 
) 

幸運的是,我知道,表演總覆蓋恰好一天 - 現在。