Flask-SQLAlchemy删除默认设置

时间:2018-09-25 12:22:46

标签: python python-3.x flask-sqlalchemy sql-delete cascade

我在Postgre DB中有两个简单的表: 与用户和角色具有多对一的关系,后面带有以下代码:

    class User(db.Model):

        id = db.Column(db.Integer, primary_key=True, nullable=False)
        created = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now)
        username = db.Column(db.String(80), unique=True, nullable=False)
        password = db.Column(db.String(256), unique=False, nullable=False)
        email = db.Column(db.String(120), unique=True, nullable=True)
        active = db.Column(db.Boolean, nullable=False, default=True)
        role_id = db.Column(db.Integer, db.ForeignKey('role.id', ondelete='SET DEFAULT'), server_default = '1', nullable = False)

        role = db.relationship('Role', backref = db.backref('users', lazy = True), passive_deletes = True)

还有

class Role(db.Model):

    id = db.Column(db.Integer, primary_key=True, nullable=False)
    slug = db.Column(db.String, nullable=False)

对DB的ON DELETE SET DEFAULT约束正确运行,但是SA在删除之前强制将Role_id的NULL更新,从而提高完整性错误。

2018-09-25 14:08:54,922 INFO sqlalchemy.engine.base.Engine UPDATE "user" SET role_id=%(role_id)s WHERE "user".id = %(user_id)s
2018-09-25 14:08:54,922 INFO sqlalchemy.engine.base.Engine {'role_id': None, 'user_id': 2}

我尝试了级联选项和Passive_deletes无效。正确的方法应该是什么?

1 个答案:

答案 0 :(得分:0)

passive_deletes = 'all'

做这项工作,但是关系声明的顺序很重要,因此 删除了 User 中的 role 声明并在 Role 中创建了相反的 users 关系。现在,SA完全根据数据库设置进行中继。

users = db.relationship('User', backref = db.backref('role', lazy = True), passive_deletes = "all")

在角色类中。