【问题标题】:Dependency rule tried to blank-out primary key column in SQL-Alchemy when trying to delete record尝试删除记录时,依赖关系规则尝试清除 SQL-Alchemy 中的主键列
【发布时间】:2016-05-04 14:28:20
【问题描述】:

Userownedshare 表和Share 表之间存在多对一关系。

当我从数据库中删除 Userownedshare 条目时,我收到以下错误:AssertionError: Dependency rule tried to blank-out primary key column 'share.ticker'

这是有道理的,因为 Userownedshare 中的 ticker 字段是 Share 表中的外键。但是我不知道如何解决这个错误。我认为我想在 Share 条目被孤立时设置级联删除,但我无法弄清楚如何执行此操作,我已阅读文档但最终出现不同类型的错误,所以我想我错过了微不足道的东西。 希望有人能帮忙,谢谢!


这是我的代码:

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

【问题讨论】:

    标签: python python-2.7 flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    好的,经过反复试验,我解决了这个问题。 我需要将cascade="all, delete-orphan", 添加到Share 类中的tickermatch 关系中。

    但我还需要将lazy="joined" 添加到Userownedshare 类中的name 关系

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多