The dependency rule tried to exclude an empty primary key column in SQL-Alchemy when trying to delete a record

I have a lot of relationships between the Userownedshare table and the Share table.

When I delete a Userownedshare entry from the database, I get the following error: AssertionError: Dependency rule tried to blank-out primary key column 'share.ticker'

This makes sense since the ticker field in Userownedshare is a foreign key in the Share table. However, I cannot decide how to fix this error. I think I want to configure cascading deletion when the Share record is played, but I can’t figure out how to do it, I read the documentation, but I just ended up with different types of errors, so I think I'm missing something trivial . Hope someone can help, thanks!


Here is my 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]) 
+5
source share
1 answer

OK, so after some trial and error I worked. I needed to add cascade="all, delete-orphan", to the tickermatch relation in the Share class.

But I also need to add lazy="joined" to the name relation in the Userownedshare class

 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") 
+3
source

Source: https://habr.com/ru/post/1241625/


All Articles