2016-11-18 3 views
0

ich diese beiden Tabellen löschen:Kann nicht meine Datenbank Aufzeichnungen

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) 

(ua, aber diese sind die wichtigsten diejenigen für meine Frage)

Jetzt muss ich aus diesen Tabellen Datensätze löschen, aber wenn sie beide enthalten Datensätze, die ich nicht löschen kann!

Ich tue dies:

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

Wenn ich versuche, Aufzeichnungen ‚Performances‘ zu löschen, werden die Protokoll Aussagen zeigen, dass ich das Äquivalent ‚target_adjustments‘ Datensatz gelöscht haben,

WARNI: before: 0

WARNI: after: 0

Aber ich bekomme immer noch diesen Fehler.

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

Warum kann ich die Leistungsdatensätze nicht löschen?

+0

Anscheinend denkt MySQL anders. Anstatt zu raten, könnten Sie tatsächlich überprüfen, ob Sie noch Referenzdaten in der target_adjustments-Tabelle hatten. – Shadow

+0

Ich habe dies angesprochen, die Protokollmeldungen zeigen, dass es keine übereinstimmenden Datensätze gibt. –

Antwort

0

Ich habe es ausgearbeitet.

Meine Löschabfrage stimmte nicht wirklich mit allen Datensätzen überein, daher gab es immer noch einen Anpassungsdatensatz in der Tabelle, als ich versuchte, die Leistung zu löschen.

Der aktualisierte Code lautet wie folgt:

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

zum Glück, ich weiß, dass Leistungen immer genau einen Tag decken - vorerst.

Verwandte Themen