2016-01-27 6 views
5

Ho una relazione molti a uno tra la tabella Userownedshare e la tabella Share.La regola di dipendenza ha tentato di eliminare la colonna chiave primaria in SQL-Alchemy quando si tenta di eliminare il record

Quando si elimina una voce di Userownedshare dal database ottengo il seguente errore: AssertionError: Dependency rule tried to blank-out primary key column 'share.ticker'

questo ha un senso come il campo ticker in Userownedshare è una chiave esterna nella tabella Share. Tuttavia non riesco a capire come risolvere questo errore. Penso di voler impostare una cancellazione a cascata quando una voce Share è orfana ma non riesco a capire come farlo, ho letto la documentazione, ma mi sono ritrovato con diversi tipi di errori quindi penso di mancare qualcosa di banale . Spero che qualcuno possa aiutarti, grazie!


Ecco il mio codice:

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

risposta

3

OK, così dopo alcuni tentativi ed errori ho lavorato fuori. Avevo bisogno di aggiungere cascade="all, delete-orphan", alla relazione tickermatch nella classe Share.

Ma ho anche bisogno di aggiungere lazy="joined" al rapporto name nella classe Userownedshare

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