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
, CONSTRAINTtarget_adjustments_ibfk_1
FOREIGN KEY (competitor_id
,start_date
) REFERENCESperformances
(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?
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
Ich habe dies angesprochen, die Protokollmeldungen zeigen, dass es keine übereinstimmenden Datensätze gibt. –