2016-01-27 8 views
5

zu löschen Ich habe eine viele zu eins-Beziehung zwischen der Userownedshare-Tabelle und der Share-Tabelle.Abhängigkeitsregel versucht, Primärschlüsselspalte in SQL-Alchemie auszufüllen, wenn versucht wird, Datensatz

Wenn ich einen Userownedshare Eintrag aus der Datenbank löschen ich die folgende Fehlermeldung erhalten: AssertionError: Dependency rule tried to blank-out primary key column 'share.ticker'

Dies macht Sinn, da das ticker Feld in Userownedshare ein Fremdschlüssel in der Tabelle Share ist. Ich kann jedoch nicht herausfinden, wie ich diesen Fehler beheben kann. Ich denke, dass ich eine kaskadierende Löschung einrichten möchte, wenn ein Share Eintrag verwaist ist, aber ich kann nicht herausfinden, wie dies zu tun ist, habe ich die Dokumentation gelesen, aber ich am Ende mit verschiedenen Arten von Fehlern, so denke ich, dass ich etwas Triviales vermisse . Hoffe jemand kann helfen, danke!


Hier ist mein Code:

class Userownedshare(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    ticker = db.Column(db.String(20), db.ForeignKey('share.ticker')) 
    user = db.Column(db.String, db.ForeignKey('user.username')) 
    quantity = db.Column(db.Integer, nullable=False) 
    dividends = db.Column(db.Float, server_default="0.0") 
    triggerlevel = db.Column(db.Integer) 
    smsalert = db.Column(db.Boolean) 
    emailalert = db.Column(db.Boolean) 
    portfolioid = db.Column(db.String(50)) 
    name = db.relationship('Share', backref='userownedshare' , foreign_keys=[ticker]) 

class Share(db.Model): 
    id = db.Column(db.Integer) 
    name = db.Column(db.String(50), nullable=False) 
    ticker = db.Column(db.String(50), db.ForeignKey('userownedshare.ticker'), primary_key=True) 
    tickermatch = db.relationship('Userownedshare', backref='share', foreign_keys=[ticker]) 

Antwort

3

OK, so dass nach einigen Versuch und Irrtum arbeitete ich es aus. Ich musste cascade="all, delete-orphan", zu der tickermatch Beziehung in der Share Klasse hinzufügen.

Aber ich brauche auch lazy="joined" zur name Beziehung in der Userownedshare Klasse hinzuzufügen

class Userownedshare(db.Model): 
id = db.Column(db.Integer, primary_key=True) 
ticker = db.Column(db.String(20), db.ForeignKey('share.ticker')) 
user = db.Column(db.String, db.ForeignKey('user.username')) 
quantity = db.Column(db.Integer, nullable=False) 
dividends = db.Column(db.Float, server_default="0.0") 
triggerlevel = db.Column(db.Integer) 
smsalert = db.Column(db.Boolean) 
emailalert = db.Column(db.Boolean) 
portfolioid = db.Column(db.String(50)) 
name = db.relationship('Share', backref='userownedshare', foreign_keys=[ticker], lazy="joined") 

class Share(db.Model): 
id = db.Column(db.Integer) 
name = db.Column(db.String(50), nullable=False) 
ticker = db.Column(db.String(50), db.ForeignKey('userownedshare.ticker'), primary_key=True) 
tickermatch = db.relationship('Userownedshare', backref='share', cascade="all, delete-orphan", lazy="joined")