2016-01-27 12 views
5

Tôi có mối quan hệ nhiều đến một giữa bảng Userownedshare và bảng Share.Quy tắc phụ thuộc đã cố gắng xóa trống cột khóa chính trong SQL-Alchemy khi cố gắng xóa bản ghi

Khi tôi xóa một mục Userownedshare từ cơ sở dữ liệu tôi nhận được lỗi sau: AssertionError: Dependency rule tried to blank-out primary key column 'share.ticker'

này có ý nghĩa như ticker trường trong Userownedshare là một khoá ngoại trong bảng Share. Tuy nhiên tôi không thể tìm ra cách khắc phục lỗi này. Tôi nghĩ rằng tôi muốn thiết lập một tầng tầng xóa khi một mục nhập Share là mồ côi nhưng tôi không thể làm việc ra làm thế nào để làm điều này, tôi đã đọc tài liệu nhưng tôi chỉ kết thúc với các loại khác nhau của các lỗi vì vậy tôi nghĩ rằng tôi đang thiếu một cái gì đó tầm thường . Hy vọng ai đó có thể giúp đỡ, cảm ơn!


Đây là mã của tôi:

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

Trả lời

3

OK, vì vậy sau khi một số thử và sai tôi làm việc nó ra. Tôi cần thêm cascade="all, delete-orphan", vào mối quan hệ tickermatch trong lớp Share.

Nhưng tôi cũng cần thêm lazy="joined" để mối quan hệ name trong lớp 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") 
Các vấn đề liên quan