2016-06-28 17 views
0

Ich habe Probleme beim Löschen einer Modellinstanz aus SQLAlchemy. Ich habe vor kurzem eine zusätzliche Tabelle hinzugefügt und dieser Zusatz hat dieses Problem eingeführt. Die Tabelle, die ich hinzugefügt habe, heißt editrecords.SQLAlchemy löschen Kaskade fehlschlägt

Die Datenbank ist MySQL mit einer InnoDB-Engine.

Modelle sind nachstehend definiert:

from sqlalchemy.ext.declarative import declarative_base 
Model = declarative_base(name='Model') 

class HasId(object): 
    @declared_attr 
    def id(cls): 
     return Column('id', Integer, Sequence('test_id_seq'), primary_key=True) 
    ... 

class TestParent(HasId, Model): 
    __tablename__ = 'tests' 
    discriminator = Column(String(50)) 
    __mapper_args__ = {'polymorphic_on': discriminator} 
    ... 

class FooTest(TestParent): 
    __tablename__ = 'footests' 
    __mapper_args__ = {'polymorphic_identity': 'footests'} 
    id = Column(Integer, ForeignKey('tests.id', ondelete='CASCADE'), primary_key=True) 
    ... 

class EditRecord(Model): 
    __tablename__ = 'editrecords' 
    id = Column(Integer, Sequence('editrecord_id_seq'), primary_key=True) 
    test_id = Column(Integer, ForeignKey('tests.id', ondelete='CASCADE'), nullable=False) 
    ... 

Hier kann die Funktion ist, wo die Lösch

def delete_test(test_id): 
    test = TestParent.query.get(test_id) 
    db_session.delete(test) 
    db_session.commit() 
    return(jsonify({'deleted_test': test_id})) 

auftritt Ich habe versucht, die ForeignKey Eigenschaft ondelete='CASCADE' auf die Modelle zu modifizieren und die Datenbank wieder aufzubauen, obwohl nichts ist scheint zu arbeiten. Die editrecords Tabelle gibt mir Probleme, wenn ich versuche, einen Test zu löschen, weil es eine ForeignKey zeigt, die auf tests zeigt.

Die Fehlermeldung, die ich immer bin, ist unten (ausgelöst, wenn ich versuche, die Transaktion in delete_test zu begehen)

IntegrityError: (pymysql.err.IntegrityError) (1452, u'Cannot add or update a child row: a foreign key constraint fails (`bayswater_DEV`.`editrecords`, CONSTRAINT `editrecords_ibfk_1` FOREIGN KEY (`test_id`) REFERENCES `tests` (`id`) ON DELETE CASCADE)') [SQL: u'UPDATE editrecords SET test_id=%s WHERE editrecords.id = %s'] [parameters: (None, 2)] 

EDIT: für die obigen Tabellen Ergebnis SHOW CREATE TABLE <table>

Tests: http://pastebin.com/uFcEMzVZ

Fußnoten: http://pastebin.com/62uhECYn

editrecords: http://pastebin.com/3LekPywN

+0

können Sie sich einloggen, um MySQL-Server und zeigen ausführen Erstellen Sie Tabellen für die oben genannten Tabellen und erhalten Sie das Ergebnis –

+0

wird es helfen, das Problem zu identifizieren –

+0

@MaheshMadushanka Ich habe die Frage bearbeitet, um diese Informationen zu enthalten –

Antwort

0

Das Problem ist, dass Sie zwei Fremdschlüssel aus foo Tests und editrecord Tabellen Tabelle

footests

CONSTRAINT `footests_ibfk_1` FOREIGN KEY (`id`) REFERENCES `tests` (`id`) ON DELETE CASCADE, 
    CONSTRAINT `footests_ibfk_2` FOREIGN KEY (`parent_id`) REFERENCES `footests` (`id`) ON DELETE CASCADE; 

edotrecords

CONSTRAINT `editrecords_ibfk_1` FOREIGN KEY (`test_id`) REFERENCES `tests` (`id`) ON DELETE CASCADE, 
    CONSTRAINT `editrecords_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`); 

In dieser Situation zu testen, haben Sie auf Löschen haben kippen Kaskade weil wir annehmen, wenn Sie Datensatz von editrecord dannlöschenwird versucht, verwandte Datensatz aus der Testtabelle zu löschen (auf Delete cascade) aber diese Test IDs verwenden als Fremdschlüssel footest Tabelle sowie aufgrund dieser Forengin Schlüssel beschränken, wird es nicht erlauben, diese Datensätze aus dem Test zu löschen Tabelle so, dass Ihre Löschanweisung fehlschlägt

gleiche Sache passieren, wenn Sie es aus Foo Test löschen es auf löschen hat Kaskade Fremdschlüssel und es wird versuchen, Datensätze aus dem Test zu löschen, aber sie sind bereits als Fremdschlüssel in Edit Records so Es wird nicht gelöscht werden

Dies wird eine tot aussehen Situation, wo Sie Datensatz aus beiden Tabellen zur gleichen Zeit löschen können.so bitte die Frage auf Löschen Kaskade ist und es aus der Tabelle Ebene entfernen und von Code-Ebene behandeln

mit dieser Tabelle Design Sie delte Eintrag kann nicht von entweder footest oder editrecord Tabellen

Verwandte Themen